这适用于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]属性是否在模型字段中?
或者有更好的方法吗?
答案 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);
}