对于MvcHtmlString
的文档并不是特别详细:
表示一个HTML编码的字符串,不应再次编码。
我不清楚这意味着什么。看起来一些HTML助手方法返回MvcHtmlString
,但我在网上看到的一些自定义助手的示例只返回常规字符串。
问题:
MvcHtmlString
是什么?
在何时应该选择MvcHtmlString
而不是string
,反之亦然?为什么?
对于MvcHtmlString
的文档并不是特别详细:
表示一个HTML编码的字符串,不应再次编码。
我不清楚这意味着什么。看起来一些HTML助手方法返回MvcHtmlString
,但我在网上看到的一些自定义助手的示例只返回常规字符串。
问题:
MvcHtmlString
是什么?
在何时应该选择MvcHtmlString
而不是string
,反之亦然?为什么?
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"]) %>
。
MvcHtmlString
没有实现IHtmlString
,因为它只存在于4中。<%:
语法必须进行“鸭子类型” - 它将始终在调用接口之前调用.ToHtmlString()
,而不管接口如何。 - KeithMvcHtmlString.Create
方法会检测是否可用 IHtmlString
并在需要时动态创建返回的类来支持它:http://www.windowsitpro.com/article/net-framework/Encoding-and-Strings/3.aspx - KeithMvcHtmlString
,你可以告诉razor不需要对其进行编码。如果你想让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 到 3 的源代码兼容性。" source
一个很好的实际用途是,如果你想要制作自己的HtmlHelper
扩展。例如,我讨厌试图记住<link>
标签的语法,因此我创建了自己的扩展方法来生成<link>
标签:
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
,无论是<%: ... %>
还是<%= ... %>
都能正常工作。
如果您想将原始HTML传递给MVC帮助程序方法,并且不希望帮助程序方法对HTML进行编码,则可以使用MvcHtmlString
。
MvcHtmlString
? - devuxer