.NET核心要求的字段指示器

问题描述:

这是针对ASP.NET MVC Core 1.1 Web应用程序的。.NET核心要求的字段指示器

我想在我的模型,该模型有[必需]属性设置字段显示必填项指标(如标签后,一个红色的*)的一个很好的方式。

目前,我有我的标签使用LabelTagHelper的形式,像这样:

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

我有一些CSS它基于“必需的”类的存在我的标签后加*号:

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

这工作。但是,当然,如果我改变我的模型,并添加或删除[Required]属性的字段,我必须确保手动转到标记并进行相应的更改,为相关标签添加或删除“required”类。

谁能帮我用一种优雅的方式来“必需”类添加到基于模型[必需]属性的存在的标签,而不是将其硬编码到CSHTML?

也许自定义标签助手从LabelTagHelper继承?并使用反射来查看[Required]属性是否在模型字段中?

还是有更好的办法?

您可以创建一个专用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); 
     } 
    } 
}