2017-02-11 30 views
2

這是針對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]屬性是否在模型字段中?

還是有更好的辦法?

回答

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); 
     } 
    } 
}