Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的MvcHtmlString';逃逸的内容是什么?_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 为什么我的MvcHtmlString';逃逸的内容是什么?

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.

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

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>

@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