什么是MvcHtmlString,我应该何时使用它?

时间:2010-02-19 00:42:20

标签: c# asp.net-mvc

MvcHtmlString的{​​{3}}不是非常具有启发性:

  

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

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

问题:

什么是MvcHtmlString

我应该何时选择MvcHtmlString而不是string,反之亦然?为什么呢?

4 个答案:

答案 0 :(得分:244)

ASP.NET 4引入了一种新的代码块语法<%: %>。基本上,<%: foo %>会转换为<%= HttpUtility.HtmlEncode(foo) %>。该团队正试图让开发人员尽可能使用<%: %>代替<%= %>来阻止XSS。

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

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

修改

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

答案 1 :(得分:79)

这是一个迟到的答案,但如果有人在阅读这个问题时使用剃须刀,那么你应该记住的是剃刀默认编码所有内容,但是在你的html助手中使用MvcHtmlString你可以告诉剃须刀它不需要编码

如果你想让razor不对字符串进行编码,请使用

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

反编译Raw(),向我们显示它将字符串包装在HtmlString

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

HtmlString仅存在于ASP.NET 4中。

MvcHtmlString是一个兼容填充程序,添加到MVC 2以支持.NET 3.5和.NET 4.现在MVC 3只是.NET 4,它是HtmlString的一个相当简单的子类,可能是对于MVC 2-&gt; 3用于源兼容性。source

答案 2 :(得分:11)

如果您想制作自己的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,使用<%: ... %><%= ... %>都可以正常使用。

答案 3 :(得分:7)

如果要将原始HTML传递给MVC帮助程序方法并且不希望帮助程序方法对HTML进行编码,则可以使用MvcHtmlString