In Core MVC there is anew concept as Tag helpers.
We could previously create custom html helpers to attach some classes based on the validation data annotations such
For answer by Will Ray, I'd like to make a change to the override ProcessAsync
as:
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
var isRequired = For.Metadata.ValidatorMetadata.Any(x =>
x.GetType().Name.Equals("RequiredAttribute"));
if (isRequired)
{
CreateOrMergeAttribute("class", "required", output);
}
return base.ProcessAsync(context, output);
}
Since For.Metadata.IsRequired
is always true for boolean properties.
Yup, you can extend this pretty easily by inheriting from the LabelTagHelper
class and adding in your own class to the attribute list first.
[HtmlTargetElement("label", Attributes = "asp-for")]
public class RequiredLabelTagHelper : LabelTagHelper
{
public RequiredLabelTagHelper(IHtmlGenerator generator) : base(generator)
{
}
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
if (For.Metadata.IsRequired)
{
CreateOrMergeAttribute("class", "required", output);
}
return base.ProcessAsync(context, output);
}
private void CreateOrMergeAttribute(string name, object content, TagHelperOutput output)
{
var currentAttribute = output.Attributes.FirstOrDefault(attribute => attribute.Name == name);
if (currentAttribute == null)
{
var attribute = new TagHelperAttribute(name, content);
output.Attributes.Add(attribute);
}
else
{
var newAttribute = new TagHelperAttribute(
name,
$"{currentAttribute.Value.ToString()} {content.ToString()}",
currentAttribute.ValueStyle);
output.Attributes.Remove(currentAttribute);
output.Attributes.Add(newAttribute);
}
}
}