Значения по умолчанию для 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>