Индикатор обязательного поля .NET Core

Это для веб-приложения ASP.NET MVC Core 1.1.

Мне нужен хороший способ отображения индикатора обязательного поля (например, красного * после метки) для полей в моей модели, для которых установлен атрибут [Required].

В настоящее время у меня есть метки в форме с помощью LabelTagHelper, например:

<label asp-for="Surname" class="required"></label>

У меня есть CSS, который добавляет символ * после моей метки в зависимости от наличия «обязательного» класса:

label.required:after {
    color: #A94442;
    content: ' *';
    display:inline;
}

Это работает. Но, конечно, если я изменяю свою модель и добавляю или удаляю атрибут [Required] для поля, я должен убедиться, что я вручную перехожу к разметке и вношу соответствующие изменения, добавляя или удаляя «обязательный» класс для рассматриваемой метки. .

Может ли кто-нибудь помочь мне с элегантным способом добавить «обязательный» класс к метке на основе наличия атрибута [Required] в модели, а не жестко закодировать его в cshtml?

Может быть, пользовательский вспомогательный тег, который наследуется от LabelTagHelper? И использует отражение, чтобы увидеть, находится ли атрибут [Required] в поле модели?

Или есть лучший способ?


person Paul    schedule 11.02.2017    source источник
comment
это помогло? если да, не могли бы вы сделать ответ решенным?   -  person serge    schedule 18.02.2021


Ответы (2)


Вы можете создать специальный TagHelper для достижения этой цели:

[HtmlTargetElement("label", Attributes = ForAttributeName)]
public class RequiredTagHelper : TagHelper
{
    private const string ForAttributeName = "asp-for";

    [HtmlAttributeName(ForAttributeName)]
    public ModelExpression For { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        if (output == null)
            throw new ArgumentNullException(nameof(output));

        if (For.Metadata.IsRequired)
        {
            var existingClass = output.Attributes.FirstOrDefault(f => f.Name == "class");
            var cssClass = string.Empty;
            if (existingClass != null)
            {
                cssClass = $"{existingClass.Value} ";
            }

            cssClass += "required";
            output.Attributes.SetAttribute("class", cssClass);
        }
    }
}
person Métoule    schedule 11.08.2017
comment
Как сказал Жоао, вы должны проверить, является ли существующий класс нулевым, прежде чем пытаться его удалить cs if(existingClass != null) { output.Attributes.Remove(existingClass); } - person Rian Finnegan; 01.04.2020
comment
Спасибо за внимание, я отредактировал свой ответ. Вместо удаления и добавления атрибута class теперь я использую .SetAttribute, который делает то же самое. - person Métoule; 01.04.2020
comment
как мы должны его использовать? короткий пример было бы здорово - person serge; 18.02.2021
comment
@Serge класс вашей модели (введенный в ваше представление через @model) должно иметь свойство с [Required], то в вашем представлении: <label asp-for="@Model.MyRequiredField"></label> - person Métoule; 18.02.2021
comment
@Métoule смотрите мою версию, наследующую от LabelTagHelper в конце этого OP stackoverflow.com/q/66256829/961631 - person serge; 18.02.2021

Предположение:

Вместо просто output.Attributes.Remove(existingClass);, может быть, какая-то проверка, если метка не имеет атрибута «класс»:

if(existingClass != null)
{
     output.Attributes.Remove(existingClass);
}   
person João Neto    schedule 23.01.2020
comment
Добро пожаловать в Stack Overflow! Похоже, это комментарий к принятому ответу, а не сам прямой ответ. Нет ничего плохого в том, чтобы предложить альтернативное решение уже предложенному, но редактирование вашего ответа, чтобы сделать его более автономным, улучшит ваш пост. качество и изготовитель с меньшей вероятностью будут отклонены или удалены. - person Das_Geek; 23.01.2020