2010-02-19 91 views
205

documentationMvcHtmlString是不是非常有启发性:什么是MvcHtmlString,我应该什么时候使用它?

表示,不应该再编码的HTML编码的字符串。

这不是很清楚,我什么这正是其意义是。看起来有些HTML帮助程序方法返回MvcHtmlString,但我在线看到的一些自定义帮助程序的示例仅返回一个常规字符串。

问题:

什么是MvcHtmlString

当我应该选择MvcHtmlStringstring,反之亦然?为什么?

回答

240

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"]) %>

+0

我想补充一点,MVC 2是针对.Net 3.5而不是4编译的。这意味着'MvcHtmlString'没有实现'IHtmlString',因为它只存在于4中。<%:'语法必须_duck-type_ - 无论接口如何,它总是会在'.ToString()'之前调用'.ToHtmlString()'。 – Keith 2010-07-08 07:49:13

+1

我站在更正 - 实际上'MvcHtmlString.Create'方法检测是否有IHtmlString'可用并动态创建返回的类来支持它,如果它是:http://www.windowsitpro.com/article/net-framework/Encoding -and-Strings/3.aspx – Keith 2010-07-08 08:50:05

+0

在第二次阅读时仍然是一个很好的答案:) – melaos 2011-11-09 07:41:24

6

,如果你想使用原始的HTML传递到MVC的辅助方法你会使用MvcHtmlString,你不希望辅助方法来编码的HTML。

+0

嗯...我想一个HTML辅助方法的整个要点是编码的HTML。我会怎么使用HTML辅助方法,不这样做? – devuxer 2010-02-19 00:47:08

+0

而且,除此之外,我什么时候会想*回报* HTML助手方法中的'MvcHtmlString'? – devuxer 2010-02-19 00:49:07

+0

传递或返回。如果您的HTML帮助程序生成预先转义的HTML,并且您不希望其他人重新转义它,那么您会希望返回一个。 – SLaks 2010-02-19 00:51:32

11

这是一个不错的实际应用,如果你想制作自己的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,即使用<%: ... %>或将<%= ... %>都工作正常。

70

这是一个迟到的答案,但如果有人读这个问题是使用剃须刀,你应该记住的是,剃刀编码默认情况下,但在你的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

相关问题