@ Html.Raw坚持编码引号

时间:2013-07-11 15:42:57

标签: asp.net-mvc-4 razor

MVC4剃刀观点。鉴于字符串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)">

生产

<div class="spotlight slide teaser-text" id="spotlight-0" style="background: url(&#39;/media/215/spotlight01.jpg&#39;) top left no-repeat;">

Html.Rawnew MvcHtmlStringMvcHtmlString.Create的行为类似。

我会期望来制作

<div class="spotlight slide teaser-text" id="spotlight-0" style="background: url('/media/215/spotlight01.jpg') top left no-repeat;">

(注意引号)。

1 个答案:

答案 0 :(得分:3)

我已经看过包含此标记的剃刀模板的已编译DLL。据我所知,问题是这个。

Html.Raw将字符串转换为HtmlStringHttpUtility.HtmlEncodeIHtmlString个实例视为与普通字符串不同,因为它不适用于Html编码。

当在属性的上下文中给出以编程方式定义的字符串时,将调用

this.WriteAttribute(...)

使用适合生成属性的数据。此数据的一部分是调用Html.Raw生成的HtmlString。另一部分是一个标志,表明该值不是文字。

由于非文字标志状态,WriteAttribute方法最终会调用HtmlEncode。但它在HtmlString上称为,而是在此对象的字符串值上。因此,您最终会在输出中使用HTML编码值。

在属性的上下文之外,调用

this.Write(...)

这并没有遇到同样的问题。所以对我来说这似乎是一个错误(至少如果我已经准确地追踪了它)。