MvcHtmlString的文档并不是很有启发性:

表示不应再次编码的html编码字符串。

我不清楚这到底意味着什么。似乎一些HTML helper方法返回一个MvcHtmlString,但我在网上看到的几个自定义helper的例子只是返回一个常规字符串。

问题:

什么是MvcHtmlString?

什么时候我应该选择MvcHtmlString超过字符串,反之亦然?为什么?


当前回答

你可以使用MvcHtmlString,如果你想传递原始HTML到MVC帮助方法,你不希望帮助方法编码HTML。

其他回答

如果您想要创建自己的HtmlHelper扩展,这是一个很好的实用用途。例如,我讨厌记住<link>标签语法,所以我创建了自己的扩展方法来创建一个<link>标签:

<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
    Dim tag = New TagBuilder("link")
    tag.MergeAttribute("type", "text/css")
    tag.MergeAttribute("rel", "stylesheet")
    tag.MergeAttribute("href", src)
    tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
    Dim result = tag.ToString(TagRenderMode.Normal)
    Return MvcHtmlString.Create(result)
End Function

我可以从这个方法中返回String,但如果我这样做,下面的代码就会中断:

<%: Html.CssBlock(Url.Content(“~/sytles/mysite.css”)) %>

对于MvcHtmlString,使用<%:…%>或<%=…%>将正常工作。

这是一个晚的答案,但如果任何人阅读这个问题是使用razor,你应该记住的是razor默认编码一切,但通过使用MvcHtmlString在你的html助手,你可以告诉razor,它不需要编码它。

如果你想剃刀不编码字符串使用

@Html.Raw("<span>hi</span>")

反编译Raw()向我们展示了它将字符串包装在HtmlString中

public IHtmlString Raw(string value) {
    return new HtmlString(value); 
}

HtmlString只存在于ASP。净4。

MvcHtmlString是添加到MVC 2的兼容垫片,以支持。net 3.5和。net 4。现在MVC 3只是。net 4,它是HtmlString的一个相当简单的子类,大概是为了MVC 2->3的源代码兼容性。” 源

ASP。NET 4引入了一个新的代码块语法<%:%>。本质上,<%:foo %>转换为<%= HttpUtility.HtmlEncode(foo) %>。团队试图让开发人员尽可能使用<%:%>而不是<%= %>来防止XSS。

但是,这会引入一个问题,如果代码块已经对其结果进行了编码,<%:%>语法将对其重新编码。这个问题可以通过引入IHtmlString接口来解决(. net 4中新增)。如果<%:foo() %>中的foo()返回一个IHtmlString, <%: %>语法将不会重新编码它。

MVC 2的助手返回MvcHtmlString,在ASP。NET 4实现了接口IHtmlString。因此,当开发人员在ASP. Html中使用<%:Html.*() %>。NET 4,结果不会是双编码的。

编辑:

这种新语法的一个直接好处是您的视图更清晰一些。例如,你可以写<%:ViewData["anything"] %>而不是<%= Html.Encode(ViewData["anything"]) %>。

你可以使用MvcHtmlString,如果你想传递原始HTML到MVC帮助方法,你不希望帮助方法编码HTML。