什么是MvcHtmlString,何时应该使用它?
什么是MvcHtmlString,何时应该使用它?
MvcHtmlString的文档并不是非常有启发性:
表示一个不应再次编码的HTML编码字符串。
我不清楚这意味着什么。似乎一些HTML帮助器方法返回MvcHtmlString,但我在网上看到的一些自定义帮助器示例只返回常规字符串。
问题:
什么是MvcHtmlString?
何时应选择MvcHtmlString而不是string,反之亦然?为什么?
这是一个晚点的回答,但如果有人正在使用razor,你应该记住razor默认编码一切。但是,通过在HTML助手中使用MvcHtmlString
,你可以告诉razor它不需要编码它。
如果你想让razor不编码一个字符串,请使用
@Html.Raw("hi")
解开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的源代码兼容性。”来源
ASP.NET 4 引入了一个新的代码嵌入语法 <%: %>
。 实质上,<%: foo %>
转换为 <%= HttpUtility.HtmlEncode(foo) %>
。 团队正在尝试让开发人员在可能的情况下使用 <%: %>
,而不是 <%= %>
,以防止 XSS 攻击。
然而,这引入了一个问题,如果代码嵌入语法已经编码了其结果,那么 <%: %>
语法将重新编码它。这个问题通过引入 IHtmlString 接口(.NET 4 中新增)来解决。如果 <%: foo() %>
中的 foo() 返回一个 IHtmlString,则 <%: %>
语法将不会重新编码它。
MVC 2 的 helpers 返回 MvcHtmlString,而在 ASP.NET 4 中实现了 IHtmlString 接口。因此,当开发人员在 ASP.NET 4 中使用 <%: Html.*() %>
时,结果不会被双重编码。
编辑:
这种新语法的一个直接好处是您的视图会更加清晰。例如,您可以写 <%: ViewData["anything"] %>
而不是 <%= Html.Encode(ViewData["anything"]) %>
。