我想将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";
}
}
这是上述代码的输出,其中+
已替换为+
:
<script integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"></script>
如何停止此编码?
答案 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
。