asp.net mvc3 повертає необроблений html для перегляду


76

Чи є інші способи повернути необроблений html з контролера? На відміну від простого використання viewbag. як нижче:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.HtmlOutput = "<HTML></HTML>";
        return View();
    }
}

@{
    ViewBag.Title = "Index";
}

@Html.Raw(ViewBag.HtmlOutput)

Я визнаю, що існує безліч причин вводити html безпосередньо, але мені було цікаво, чому ви взяли участь у цьому випадку?
Рікон

3
У мене є застарілий код, який генерує розмітку з dll.
Річка

Відповіді:


150

Немає сенсу робити це, тому що Viewповинен генерувати html, а не контролер. Але в будь-якому випадку ви можете використовувати метод Controller.Content , який дає вам можливість вказати результат html, також тип вмісту та кодування

public ActionResult Index()
{
    return Content("<html></html>");
}

Або ви можете скористатися фокусом, вбудованим у фреймворк asp.net-mvc - зробіть рядок, що повертає дію, безпосередньо. Він доставить вміст рядків у браузер користувачів.

public string Index()
{
    return "<html></html>";
}

Насправді, для будь-якого результату дії, відмінного від ActionResult, фреймворк намагається його серіалізувати у рядок і записати у відповідь.


Я погоджуюсь з поданням, що генерує html. мій вміст розроблений із застарілої DLL. Якщо контролер не є правильним місцем для виклику, то, можливо, модель?
Річка

1
Це цікаво щодо використання рядка типу return. Це завжди спрацьовувало?
Matthew Nichols

Так. Все, що не є ActionResult, перетворюється на рядок і повертається відповідь
Archil

Чи є спосіб повернути його як PartialViewResult?
Shimmy Weitzhandler

4
Якщо ви хочете переконатися, що він відображається як html, додайте другий параметр:return Content("<html></html>", "text/html");
Grengas

8

Просто створіть властивість у вашій моделі перегляду типу MvcHtmlString. Вам не потрібно буде Html.


Дякую. Не використовував саме те, що ти сказав. Те, що ви сказали, допомогло мені зрозуміти, використовуючи [DataType.Html]
Декстер,

5

Спробуйте повернути повідомлення попередження про завантаження , це спрацювало для мене

return Content("<div class='alert alert-success'><a class='close' data-dismiss='alert'>
&times;</a><strong style='width:12px'>Thanks!</strong> updated successfully</div>");

Примітка: Не забудьте додати bootstrap cssта jsна свою сторінку перегляду

надія комусь допомагає.


Дякую, це мені справді допомогло :)
оренда

1

Це виглядає добре, якщо ви не хочете передати його як рядок моделі

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string model = "<HTML></HTML>";
        return View(model);
    }
}

@model string
@{
    ViewBag.Title = "Index";
}

@Html.Raw(Model)

0

Що працювало для мене (ASP.NET Core), це встановити тип повернення ContentResult, потім обернути в нього HMTL і встановити ContentType "text/html; charset=UTF-8". Це важливо, оскільки, інакше він не буде інтерпретований як HTML, а мова HTML відображатиметься як текст.

Ось приклад, частина класу Controller:

/// <summary>
/// Startup message displayed in browser.
/// </summary>
/// <returns>HTML result</returns>
[HttpGet]
public ContentResult Get()
{
    var result = Content("<html><title>DEMO</title><head><h2>Demo started successfully."
      + "<br/>Use <b><a href=\"http://localhost:5000/swagger\">Swagger</a></b>"
      + " to view API.</h2></head><body/></html>");
    result.ContentType = "text/html; charset=UTF-8";
    return result;
}

-1
public ActionResult Questionnaire()
{
    return Redirect("~/MedicalHistory.html");
}

4
Будь-ласка, опишіть у своїй відповіді, в чому була проблема, і як цей фрагмент її вирішить, щоб допомогти іншим зрозуміти цю відповідь
slideshowp2

-2

У контролері ви можете використовувати MvcHtmlString

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string rawHtml = "<HTML></HTML>";
        ViewBag.EncodedHtml = MvcHtmlString.Create(rawHtml);
        return View();
    }
}

У своєму поданні ви можете просто використовувати ту динамічну властивість, яку ви встановили у своєму контролері, як показано нижче

<div>
        @ViewBag.EncodedHtml
</div>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.