3

次のタグ ヘルパーがあるとします。

[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 ページで問題を提起しました

4

1 に答える 1

1

の属性リストに属性を追加する場合HtmlTargetElement、その属性はタグ ヘルパーを適用するために必要であり、値が必要です。

値なしまたは空の値で使用しようとすると、次のようなエラーが発生します。

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

タイプ 'WebApplication7.TagHelpers.SubresourceIntegrityHashAlgorithm' のタグ ヘルパー バインド属性を空にしたり、空白のみを含めたりすることはできません

属性の型を文字列などの null 許容型に変更しても、同じエラーが発生します。これまでのところ、オプションの属性を持つために私が見つけた最良の方法は、それらを属性のリストに含めないことです:

[HtmlTargetElement("script")]

もちろん、これは、属性があるかどうかに関係なく、タグ ヘルパーが適用されることを意味し、asp-subresource-integrityほとんどの場合、それは望ましくありません。これを解決するには、いくつかの方法があります。

  • 別の属性を「マーカー」属性として使用できます。これは、マーカー属性が存在する場合に適用されるタグ ヘルパーを制限する以外に効果はありません。

    [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>
于 2016-02-25T13:04:09.410 に答える