In your Application_Start
add the following line to associate an adapater to your custom attribute that will be responsible for emitting the client side validation attributes:
DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(SsnAttribute),
typeof(RegularExpressionAttributeAdapter)
);
The reason why you need this is the way RegularExpressionAttribute
is implemented. It doesn't implement IClientValidatable
interface but it rather has a RegularExpressionAttributeAdapter
which is associated to it.
In your case you have a custom attribute that derives from RegularExpressionAttribute
but your attribute doesn't implement the IClientValidatable
interface in order for client validation to work nor does it have an attribute adapter associated to it (contrary to its parent class). So your SsnAttribute
should either implement the IClientValidatable
interface or have an adapter associated as suggested previously in my answer.
This being said personally I don't see much point in implementing this custom validation attribute. A constant might be sufficient in this case:
public const string Ssn = @"^(?!000)(?!666)(?!9[0-9][0-9])\d{3}[- ]?(?!00)\d{2}[- ]?(?!0000)\d{4}$", ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank";
and then:
public class FooModel
{
[RegularExpression(Ssn, ErrorMessage = "The SSN you entered is invalid. If you do not have this number please leave the field blank")]
public string Ssn { get; set; }
}
seems quite readable.