我编写了一个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文件中的引号和双引号字符分别编码为'
和"
。
如果我用以下代码替换扩展方法的调用,则输出中的引号字符不会被编码:
<style>
@Html.Raw(File.ReadAllText(Server.MapPath(("~/assets/css/critical.css"))))
</style>
有人可以解释为什么我的扩展方法会转义输出吗?
答案 0 :(得分:3)
您正在使用TagBuilder.SetInnerText()
,它对输入进行了html编码:
将元素的InnerHtml属性设置为指定字符串的HTML编码版本。
只需将字符串直接分配给TagBuilder.InnerHtml
即可按原样设置文字:
获取或设置元素的内部HTML值。
<强>说明强>
要在将InnerHtml属性设置为字符串之前对字符串进行HTML编码,请使用SetInnerText(String)方法。