Значения по умолчанию для ASP.NET Core Свойства TagHelper

Если у меня есть следующий помощник тегов:

[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 здесь, поскольку это действительно должна быть встроенная функция.

1 ответ

Решение

Когда вы добавляете атрибут в список атрибутов HtmlTargetElement, атрибут необходим для применения помощника по тегам и требует значения.

Если вы попытаетесь использовать его без значения или с пустым значением, вы получите сообщение об ошибке:

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

Атрибуты, связанные с помощником тегов, типа "WebApplication7.TagHelpers.SubresourceIntegrityHashAlgorithm" не могут быть пустыми или содержать только пробелы

Даже если вы измените тип атрибута на обнуляемый тип, такой как строка, вы получите ту же ошибку. До сих пор лучший способ, который я нашел для наличия необязательных атрибутов, это не иметь их в списке атрибутов:

[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>
Другие вопросы по тегам