C# 为什么我的MvcHtmlString';逃逸的内容是什么?
我已经编写了一个HtmlHelper扩展方法,它读取CSS文件的内容并将其包装到一个C# 为什么我的MvcHtmlString';逃逸的内容是什么?,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我已经编写了一个HtmlHelper扩展方法,它读取CSS文件的内容并将其包装到一个标记中: public static IHtmlString EmbedCss(this HtmlHelper htmlHelper, string cssFile) { var httpContext = htmlHelper.ViewContext.RequestContext.HttpContext; var physicalCssFileName = httpContext.Server.
标记中:
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文件中的引号和双引号字符被编码为'分别为code>和“
如果用以下代码替换扩展方法的调用,则输出中的引号字符不会被编码:
<style>
@Html.Raw(File.ReadAllText(Server.MapPath(("~/assets/css/critical.css"))))
</style>
@Html.Raw(File.ReadAllText(Server.MapPath(“~/assets/css/critical.css”)))
有人能解释一下为什么我的扩展方法会转义输出吗?您使用的是哪个html编码输入:
将元素的InnerHtml属性设置为指定字符串的HTML编码版本
只需将字符串直接指定给,即可按原样设置文本:
获取或设置元素的内部HTML值
备注
要在将InnerHtml属性设置为字符串之前对字符串进行HTML编码,请使用SetInnerText(string)方法
MvcHtmlString为您编码,而Html.Raw为您编码not@AlexK.HtmlHelper.Raw执行以下操作:public IHtmlString Raw(字符串值){return new HtmlString(value);},因此我将扩展方法的最后一行更改如下:return new HtmlString(tb.ToString());但它没有改变任何内容。输出仍在编码中。@CodeCaster检查和@AlexK之间返回值的差异。该文档不完整。请参阅和:“表示不应再次编码的HTML编码字符串”。(Mvc)HtmlString
类不会对其输入进行编码,打印时MVC也不会对其值进行编码。编辑:您刚更改了名称吗?:P