Asp.net mvc 4 @Raw坚持对引号进行编码
Asp.net mvc 4 @Raw坚持对引号进行编码,asp.net-mvc-4,razor,Asp.net Mvc 4,Razor,MVC4razor视图。假设字符串backgroundImage设置如下: backgroundImage = string.Format("background: url('{0}') top left no-repeat;", project.MainImage); 为什么会这样 <div class="spotlight slide teaser-text" id="@slideId" style="@Html.Raw(backgroundImage)"> (注意引号)。我
MVC4
razor视图。假设字符串backgroundImage
设置如下:
backgroundImage = string.Format("background: url('{0}') top left no-repeat;", project.MainImage);
为什么会这样
<div class="spotlight slide teaser-text" id="@slideId" style="@Html.Raw(backgroundImage)">
(注意引号)。我已经查看了包含此标记的razor模板的编译DLL。在我看来,问题是这样的
Html.Raw
将字符串转换为HtmlString
HttpUtility.HtmlEncode
将IHtmlString
实例与普通字符串区别对待,因为它不应用Html编码
当在属性的上下文中给出以编程方式定义的字符串时,将调用
this.WriteAttribute(...)
this.Write(...)
使用适当的数据生成属性。部分数据是调用Html.Raw
生成的HtmlString。另一部分是一个标志,指示该值不是文字
由于非文字标记状态,WriteAttribute
方法最终调用HtmlEncode
。但是它不是在HtmlString
上调用这个,而是在这个对象的字符串值上调用它。因此,您最终会在输出中得到一个HTML编码的值
在属性的上下文之外,调用
this.WriteAttribute(...)
this.Write(...)
而这并不存在同样的问题。因此,对我来说,这似乎是一个bug(至少如果我已经准确地跟踪了它的话)。
Html.Raw()
只返回一个HtmlString
,而MvcHtmlString
扩展了HtmlString
;我想你所看到的是预料之中的吗?@镭:不是;所有这些都是为了防止逃逸。只是在MVC3上尝试了一下,得到了预期的结果(我在这台机器上没有MVC4)。所以可能它在4中改变了。如果你直接写出来,而不是把它放在属性中,会发生什么呢?@JoeEnos它是编码的。奇怪的是,如果它不是作为属性值输出,它就不会被编码。