.NET Core必填字段指示器

Pau*_*aul 5 required asp.net-core asp.net-core-tag-helpers

这是针对ASP.NET MVC Core 1.1 Web应用程序的。

我想要一种很好的方式来显示模型中具有[Required]属性设置的字段的必填字段指示符(如标签后的红色*)。

目前,我使用LabelTagHelper将标签贴在表单上,​​如下所示:

<label asp-for="Surname" class="required"></label>
Run Code Online (Sandbox Code Playgroud)

我有一些CSS,它根据“ required”类的存在在标签后添加*符号:

label.required:after {
    color: #A94442;
    content: ' *';
    display:inline;
}
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以通过一种优雅的方式帮助我,根据模型中[Required]属性的存在将“ required”类添加到标签中,而不必将其硬编码到cshtml中?

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

或者,还有更好的方法?

Mét*_*ule 6

您可以创建一个专用的 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)