I created the following custom RegularExpressionAttribute
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class AlphaNumericAttribute: RegularExpressionAttribute, IClientValidatable { public AlphaNumericAttribute() : base("^[-A-Za-z0-9]+$") { } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "alphanumeric" }; } }
The field in the ViewModel is decorated with my AlphaNumeric attribute:
[AlphaNumeric(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.DriverLicenseNumber_RegexError_)] public string DriverLicenseNumber { get; set; }
The field is built in the view:
@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" })) { @Html.LabelFor(m => m.DriverLicenseNumber) @Html.ValidationMessageFor(m => m.DriverLicenseNumber) @Html.TextBoxFor(m => m.DriverLicenseNumber) }
This should result in the corresponding "data" validation attributes in my html input tag. However, the displayed tag is as follows:
<input data-val="true" data-val-alphanumeric="Please enter a valid driver license number." id="DriverLicenseNumber" name="DriverLicenseNumber" type="text" value="" maxlength="20" class="valid">
There are clearly no data-val-regex and data-val-regex-pattern attributes that are supposed to be visualized.
I built other validators with the same structure and they work correctly, like this SSN check, which handles masked spaces for nested input using jquery masking:
public class SsnAttribute : RegularExpressionAttribute, IClientValidatable { public SsnAttribute() : base("^([0-9]{3}โ[0-9]{2}โ[0-9]{4})|([ ]{3}โ[ ]{2}โ[ ]{4})|([0-9]{9,9})$") { } public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "ssn" }; }
}
With accompanying application in ViewModel:
[Ssn(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.SocialSecurity_RegexError_)] public new string SocialSecurityNumber { get; set; }
The field is built in the view:
@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" })) { @Html.LabelFor(m => m.SocialSecurityNumber) @Html.ValidationMessageFor(m => m.SocialSecurityNumber) @Html.TextBoxFor(m => m.SocialSecurityNumber) }
This validation attribute correctly displays the data-val-regex and data-val-regex-pattern attributes:
<input class="SSNMask valid" data-val="true" data-val-regex="Please enter a valid social security number." data-val-regex-pattern="^([0-9]{3}โ[0-9]{2}โ[0-9]{4})|([ ]{3}โ[ ]{2}โ[ ]{4})|([0-9]{9,9})$" id="SocialSecurityNumber" name="SocialSecurityNumber" type="text" value="" maxlength="22">
I cannot understand what I am missing with the AlphaNumeric attribute, that it does not display the corresponding html attributes.