asp.net mvc3:如何将原始HTML返回视图?

80

我能否以其他方式从控制器返回原始HTML?而不仅仅是使用ViewBag,如下所示:

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

@{
    ViewBag.Title = "Index";
}

@Html.Raw(ViewBag.HtmlOutput)

我承认直接注入HTML有很多原因,但我很好奇你在这种情况下为什么要这样做? - Rikon
3
我有一些遗留代码,它能够从动态链接库生成标记语言。 - River
7个回答

156

这样做没有太多意义,因为View应该生成HTML而不是控制器。但无论如何,您可以使用Controller.Content方法,它允许您指定结果HTML,还可以设置内容类型和编码。

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

你也可以使用内置在asp.net-mvc框架中的技巧 - 使操作直接返回字符串。这将向用户的浏览器传递字符串内容。

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

实际上,对于任何不是ActionResult的动作结果,框架会尝试将其序列化为字符串并写入响应中。


我同意使用视图生成HTML的观点。我的内容思想是从一个旧的dll生成的。如果控制器不是调用的正确位置,那么也许应该在模型中? - River
1
使用字符串返回类型这一点很有趣。那一直都有效吗? - Matthew Nichols
是的。任何不是ActionResult的内容都会被转换为字符串并返回响应。 - archil
有没有一种方法可以将其作为“PartialViewResult”返回? - Shimmy Weitzhandler
7
如果您想确保它被呈现为HTML,则添加第二个参数:return Content("<html></html>", "text/html"); - Grengas

8

只需在您的视图模型中创建一个类型为MvcHtmlString的属性。这样,您就不需要再使用Html.Raw了。


谢谢。我没有完全使用你说的话,但是你所说的帮助我弄清了如何使用[DataType.Html]。 - Dexter

6

试试 返回 bootstrap 提示消息,这对我有用

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的cssjs。 希望能对某些人有所帮助。

谢谢,这真的帮了我很多 :) - rentire

5

对于我正在使用的ASP.NET Core,有效的方法是设置返回类型ContentResult,然后将HTML内容包装在其中,并将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;
}

2

看起来不错,除非你想把它作为模型字符串传递

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

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

@Html.Raw(Model)

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

4
请在您的回答中描述问题是什么,以及这个代码片段将如何解决它,以帮助其他人理解这个答案。 - Lin Du

-2

在控制器中,您可以使用MvcHtmlString

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

在您的视图中,您可以像下面这样简单地使用您在控制器中设置的动态属性。
<div>
        @ViewBag.EncodedHtml
</div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接