什么是MvcHtmlString,我应该什么时候使用它?
的documentation为MvcHtmlString
是不是非常有启发性:什么是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.*() %>
时,结果将不会被双重编码。
编辑:
这种新语法的一个直接好处是,你的意见是干净了一点。例如,您可以编写而不是<%= Html.Encode(ViewData["anything"]) %>
。
,如果你想使用原始的HTML传递到MVC的辅助方法你会使用MvcHtmlString
,你不希望辅助方法来编码的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
,即使用<%: ... %>
或将<%= ... %>
都工作正常。
这是一个迟到的答案,但如果有人读这个问题是使用剃须刀,你应该记住的是,剃刀编码默认情况下,但在你的HTML辅助使用MvcHtmlString
你可以告诉剃须刀,它并不需要的一切编码它。
如果你想剃刀不编码字符串中使用
@Html.Raw("<span>hi</span>")
反编译生(),向我们展示了它的包裹字符串中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
我想补充一点,MVC 2是针对.Net 3.5而不是4编译的。这意味着'MvcHtmlString'没有实现'IHtmlString',因为它只存在于4中。 Keith 2010-07-08 07:49:13
我站在更正 - 实际上'MvcHtmlString.Create'方法检测是否有IHtmlString'可用并动态创建返回的类来支持它,如果它是:http://www.windowsitpro.com/article/net-framework/Encoding -and-Strings/3.aspx – Keith 2010-07-08 08:50:05
在第二次阅读时仍然是一个很好的答案:) – melaos 2011-11-09 07:41:24