什么是MvcHtmlString,我应该什么时候使用它?
MvcHtmlString
的文档不是非常有启发性的:
表示不应再次编码的HTML编码的string。
我不清楚这到底是什么意思。 看来有些HTML帮助器方法返回一个MvcHtmlString
,但是我在网上看到的一些自定义帮助器的例子只是返回一个常规的string。
问题:
什么是MvcHtmlString
?
什么时候应该selectMvcHtmlString
不是string
,反之亦然? 为什么?
ASP.NET 4引入了新的代码块语法<%: %>
。 实质上, <%: foo %>
转换为<%= HttpUtility.HtmlEncode(foo) %>
。 该小组试图让开发人员尽可能使用<%: %>
而不是<%= %>
来防止XSS。
但是,这引入了如果代码块已经对其结果进行编码,那么<%: %>
语法将对其进行重新编码 。 这是通过引入IHtmlString接口(在.NET 4中新增)解决的。 如果<%: foo() %>
返回一个IHtmlString,那么<%: %>
语法将不会重新编码它。
MVC 2的帮助器返回MvcHtmlString,它在ASP.NET 4上实现了接口IHtmlString。 因此,当开发人员在ASP.NET 4中使用<%: Html.*() %>
时,结果将不会被双重编码。
编辑:
这个新语法的直接好处是您的视图更清晰一些。 例如,你可以写<%: ViewData["anything"] %>
而不是<%= Html.Encode(ViewData["anything"]) %>
。
这是一个迟到的答案,但如果有人阅读这个问题是使用razor,你应该记住的是,razor默认编码的一切, 但通过使用MvcHtmlString
在你的HTML帮手,你可以告诉razor,它不需要编码 。
如果你想razor不编码string使用
@Html.Raw("<span>hi</span>")
反编译Raw(),告诉我们它将string包装在一个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。 “ 来源
这是一个很好的实际应用,如果你想制作自己的HtmlHelper
扩展。 例如,我讨厌试图记住<link>
标记语法,所以我创build了自己的扩展方法来创build<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
。