Answers:
ASP.NET 4引入了新的代码块语法<%: %>
。本质上,<%: foo %>
翻译为<%= HttpUtility.HtmlEncode(foo) %>
。该团队正在尝试让开发人员使用它,<%: %>
而不是<%= %>
尽可能避免使用XSS。
但是,这带来了一个问题,如果代码块已经对其结果进行了编码,则<%: %>
语法将对其进行重新编码。通过引入IHtmlString接口(.NET 4中的新增功能)可以解决此问题。如果FOO()的<%: foo() %>
返回一个IHtmlString,该<%: %>
语法不会重新编码。
MVC 2的助手返回MvcHtmlString,它在ASP.NET 4上实现接口IHtmlString。因此,当开发人员<%: Html.*() %>
在ASP.NET 4中使用时,结果将不会被双重编码。
编辑:
这种新语法的直接好处是您的视图更加简洁。例如,您可以编写<%: ViewData["anything"] %>
而不是<%= Html.Encode(ViewData["anything"]) %>
。
MvcHtmlString.Create
方法检测是否IHtmlString
可用,并动态地创建返回的类,以支持它,如果它是:windowsitpro.com/article/net-framework/Encoding-and-Strings/...
这是一个很晚的答案,但是如果阅读此问题的任何人都在使用razor,则您应该记住的是,默认情况下,razor会对所有内容进行编码,但是通过MvcHtmlString
在html helper中使用,您可以告诉razor不需要对其进行编码。
如果您希望剃须刀不对字符串进行编码,请使用
@Html.Raw("<span>hi</span>")
反编译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可以实现源兼容性。” 来源
如果您想进行自己的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
,使用<%: ... %>
或<%= ... %>
均可正常工作。
你会使用的MvcHtmlString
,如果你想使用原始的HTML传递到MVC的辅助方法和你不想要的helper方法来编码的HTML。
MvcHtmlString
?
MvcHtmlString
它没有实现,IHtmlString
因为它仅存在于4中。<%:
语法必须为duck-type-始终.ToHtmlString()
在.ToString()
接口之前调用。