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它是编码的。奇怪的是,如果它不是作为属性值输出,它就不会被编码。