MvcHtmlString的文档并不是很有启发性:
表示不应再次编码的html编码字符串。
我不清楚这到底意味着什么。似乎一些HTML helper方法返回一个MvcHtmlString,但我在网上看到的几个自定义helper的例子只是返回一个常规字符串。
问题:
什么是MvcHtmlString?
什么时候我应该选择MvcHtmlString超过字符串,反之亦然?为什么?
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。