2017-02-11 10 views
2

Это для веб-приложения ASP.NET MVC Core 1.1.Обязательный индикатор поля .NET Core

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

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

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

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

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

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

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

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

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

ответ

0

Вы можете создать специальный 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.ToString(); 
      } 

      cssClass += " required"; 
      output.Attributes.Remove(existingClass); 
      output.Attributes.Add("class", cssClass); 
     } 
    } 
}