1

我想将该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>

如何阻止这种编码的发生?

4

1 回答 1

5

提供的代码对我不起作用,因为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)=TagHelperAttributeValue

在 Razor 中,strings 会自动转义。如果要避免转义,则必须HtmlString改用。

于 2016-02-27T16:34:39.333 回答