Add a post on required HTML attributes in ASP.NET Core
This commit is contained in:
parent
2b087feceb
commit
989249a264
51
src/posts/RequiredHtmlAttributeAspNet.md
Normal file
51
src/posts/RequiredHtmlAttributeAspNet.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
---
|
||||||
|
title: Add Required HTML Attribute In ASP.NET Core
|
||||||
|
description: A tag helper that adds the required attribute to inputs for properties marked as required
|
||||||
|
tags: [ Programming, C#, ASP.NET Core ]
|
||||||
|
---
|
||||||
|
|
||||||
|
By default using the input `asp-for` tag helper on `input`s will not add the `required` attribute for properties marked with `[Required]`. It instead relies on jQuery Validation attributes. This can be a problem if you don't use jQuery and for accessibility.
|
||||||
|
|
||||||
|
This tag helper will run alongside the default `asp-for` helper and will add the `required` attribute if the matching property is marked `[Required]`. This will also add the `required` attribute for non-nullable types. It will not add the attribute to checkboxes, as that indicates the checkbox must be checked.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
||||||
|
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The default input and select tag helpers don't add the <c>required</c> attribute to required
|
||||||
|
/// elements, so this does it instead
|
||||||
|
/// </summary>
|
||||||
|
[HtmlTargetElement("input", Attributes = "asp-for")]
|
||||||
|
[HtmlTargetElement("select", Attributes = "asp-for")]
|
||||||
|
[HtmlTargetElement("textarea", Attributes = "asp-for")]
|
||||||
|
public class RequiredInputTagHelper : TagHelper
|
||||||
|
{
|
||||||
|
public override int Order { get => int.MaxValue; }
|
||||||
|
|
||||||
|
[HtmlAttributeName("asp-for")]
|
||||||
|
public ModelExpression For { get; set; }
|
||||||
|
|
||||||
|
public override void Process(TagHelperContext context, TagHelperOutput output)
|
||||||
|
{
|
||||||
|
base.Process(context, output);
|
||||||
|
|
||||||
|
// Don't do anything if there's already a required attribute
|
||||||
|
if (context.AllAttributes["required"] is not null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Don't make check boxes required, that indicates that it must be checked
|
||||||
|
if (this.For.Model is bool)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The property has [Required] or it is a value type (e.g. int) and is not nullable (e.g. int?)
|
||||||
|
if (this.For.ModelExplorer.Metadata.ValidatorMetadata.Any(a => a is RequiredAttribute)
|
||||||
|
|| (this.For.ModelExplorer.ModelType.IsValueType
|
||||||
|
&& (!this.For.ModelExplorer.ModelType.IsGenericType
|
||||||
|
|| (this.For.ModelExplorer.ModelType.IsGenericType
|
||||||
|
&& this.For.ModelExplorer.ModelType.GetGenericTypeDefinition() != typeof(Nullable<>)))))
|
||||||
|
output.Attributes.Add(new TagHelperAttribute("required"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Loading…
Reference in a new issue