ASP.NET Core TagHelper属性的默认值

时间:2016-02-25 09:54:59

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

如果我有以下标记助手:

[Flags]
public enum SubresourceIntegrityHashAlgorithm
{
    SHA256 = 1,
    SHA384 = 2,
    SHA512 = 4
}  

[HtmlTargetElement("script", Attributes = "asp-subresource-integrity")]
public class FooTagHelper : TagHelper
{
    [HtmlAttributeName("asp-subresource-integrity")]
    public SubresourceIntegrityHashAlgorithm HashAlgorithms { get; set; } 
        = SubresourceIntegrityHashAlgorithm.SHA256;

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        // ...
    }
}

如何使用我在上面的属性上给出的默认值,这样我就不必在使用它时为属性提供值:

<script asp-subresource-integrity src="..."></script>

而不是:

<script asp-subresource-integrity="SubresourceIntegrityHashAlgorithm.SHA256" src="..."></script>

更新

我在MVC GitHub页面here上提出了一个问题,因为这应该是一个内置功能。<​​/ p>

1 个答案:

答案 0 :(得分:1)

当您将属性添加到HtmlTargetElement的属性列表时,该属性是应用标记帮助程序所必需的,并且需要一个值。

如果您尝试使用没有值或空值,则会出现如下错误:

<my-script asp-subresource-integrity src="foo.js"></my-script>
  

标记帮助器绑定属性类型&#39; WebApplication7.TagHelpers.SubresourceIntegrityHashAlgorithm&#39;不能为空或仅包含空格

即使您将属性的类型更改为类似字符串的可空类型,也会出现相同的错误。到目前为止,我发现具有可选属性的最佳方法是不将它们放在属性列表中:

[HtmlTargetElement("script")]

当然,这意味着无论是否存在属性asp-subresource-integrity,都会应用您的代码帮助程序,而且您很可能不希望这样。有两种方法可以解决这个问题:

  • 您可以使用其他属性作为&#34;标记&#34;属性,除了限制在标记属性存在时应用标记帮助程序之外没有任何其他效果。

    [HtmlTargetElement("script", Attributes = "my-script")]
    public class FooScriptTagHelper : TagHelper
    {
        ...
    }
    
    <!--This uses the default value-->
    <script my-script src="foo.js"></script>
    <!--This uses a specific value-->
    <script my-script asp-subresource-integrity="..." src="foo.js"></script>
    
  • 替代方法是使用自定义标记名称,然后在使用默认值时可以省略该属性:

    [HtmlTargetElement("my-script")]
    
    <!--This uses the default value-->
    <my-script src="foo.js"></my-script>
    <!--This uses a specific value-->
    <my-script asp-subresource-integrity="..." src="foo.js"></my-script>
    

请记住,即使使用这些方法,当您使用该属性时,仍需要提供值。我的意思是,您可以添加或省略属性,但如果属性存在,则需要非空值:

<!--This will still throw an exception-->
<my-script asp-subresource-integrity src="foo.js"></my-script>