在不编码的情况下设置ASP.NET Core TagHelper属性

时间:2016-02-27 14:49:39

标签: asp.net razor asp.net-core asp.net-core-mvc tag-helpers

我想将integrity属性添加到我的标记帮助器中的脚本标记中。它包含一个+符号,我不想编码。

<script integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"></script>

这是我的标签助手:

[HtmlTargetElement(Attributes = "script")]
public class MyTagHelper : TagHelper
{
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        // Omitted...

        output.Attributes["integrity"] = "sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7";
    }
}

这是上述代码的输出,其中+已替换为&#x2B;

<script integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky&#x2B;er10rcgNR/VqsVpcw&#x2B;ThHmYcwiB1pbOxEbzJr7"></script>

如何停止此编码?

1 个答案:

答案 0 :(得分:4)

提供的代码对我不起作用,因为未调用ProcessAsync方法。这有些问题(抽象类无法实例化,没有script属性等)。

解决方案基本上是您自己创建TagHelperAttribute课程,而不是简单地指定string类型。

@section Scripts {
    <script></script>
}

标签助手

[HtmlTargetElement("script")]
public class MyTagHelper : TagHelper
{
    public const string IntegrityAttributeName = "integrity";
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        // Omitted...

        output.Attributes[IntegrityAttributeName] = new TagHelperAttribute(IntegrityAttributeName, new HtmlString("sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"));

        await Task.FromResult(true);
    }
}

这正确输出

<script integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"></script>

原因是TagHelperAttribute隐式(public static implicit operator TagHelperAttribute(string value))运算符的运算符重载=,它将创建TagHelperAttribute并将字符串作为它是Value

在Razor中,string会自动转义。如果您想避免转义,则必须使用HtmlString