.NET Core必需的字段指示符

时间:2017-02-11 18:52:59

标签: asp.net-core required asp.net-core-tag-helpers

这适用于ASP.NET MVC Core 1.1 Web应用程序。

我喜欢在我的模型中设置[Required]属性集的字段中显示必需字段指示符(如标签后面的红色*)的好方法。

目前我使用LabelTagHelper在表单上有我的标签,如下所示:

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

我有一些CSS,根据&#34; required&#34;的存在,在我的标签后添加*符号。类:

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

这很有效。但是当然如果我更改我的模型并添加或删除字段的[必需]属性,我必须确保我手动转到标记并进行相应的更改,添加或删除&#34; required&#34;有问题的标签的类。

任何人都可以通过优雅的方式帮助我添加&#34;必需的&#34;基于模型上[Required]属性的存在而不是必须将其硬编码到cshtml中的类标签?

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

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

建议:

如果标签不具有属性“ class”,则可能需要进行一些验证,而不只是output.Attributes.Remove(existingClass);

if(existingClass != null)
{
     output.Attributes.Remove(existingClass);
}