8

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 MvcHtmlString并且MvcHtmlString.Create所有行为都相似。

希望它会产生

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

(注意引号)。

4

1 回答 1

3

我查看了包含此标记的剃刀模板的编译 DLL。据我所知,问题是这样的。

Html.Raw将字符串转换为HtmlString. HttpUtility.HtmlEncode以不同于普通字符串的方式处理IHtmlString实例,因为它不应用 Html 编码。

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

this.WriteAttribute(...)

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

由于非文字标志状态,该WriteAttribute方法最终调用HtmlEncode. 但它不是在 上调用 this HtmlString,而是在这个对象的字符串值上调用 this 。所以你最终会在输出中得到一个 HTML 编码的值。

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

this.Write(...)

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

于 2013-07-12T10:21:57.633 回答