为什么我的MvcHtmlString内容被转义?

时间:2015-04-06 11:16:43

标签: c# asp.net-mvc razor

我编写了一个HtmlHelper扩展方法,它读取CSS文件的内容并将其包装到<style>标记中:

public static IHtmlString EmbedCss(this HtmlHelper htmlHelper, string cssFile)
{
    var httpContext = htmlHelper.ViewContext.RequestContext.HttpContext;
    var physicalCssFileName = httpContext.Server.MapPath(cssFile);

    if (!File.Exists(physicalCssFileName))
    {
        throw new FileNotFoundException(
          string.Format("Requested CSS file \"{0}\" is not found",
                        physicalCssFileName));
    }

    var css = File.ReadAllText(physicalCssFileName);
    var tb = new TagBuilder("style");
    tb.Attributes["type"] = "text/css";
    tb.SetInnerText(css.TrimStart(' ').TrimEnd(' '));
    return MvcHtmlString.Create(tb.ToString());
}

然后我在视图中调用此方法:

@Html.EmbedCss("~/assets/css/critical.css")

CSS文件中的引号和双引号字符分别编码为&#39;&quot;

如果我用以下代码替换扩展方法的调用,则输出中的引号字符不会被编码:

<style>
    @Html.Raw(File.ReadAllText(Server.MapPath(("~/assets/css/critical.css"))))
</style>

有人可以解释为什么我的扩展方法会转义输出吗?

1 个答案:

答案 0 :(得分:3)

您正在使用TagBuilder.SetInnerText(),它对输入进行了html编码:

  

将元素的InnerHtml属性设置为指定字符串的HTML编码版本

只需将字符串直接分配给TagBuilder.InnerHtml即可按原样设置文字:

  

获取或设置元素的内部HTML值。

     

<强>说明

     

要在将InnerHtml属性设置为字符串之前对字符串进行HTML编码,请使用SetInnerText(String)方法。