ValidationAttributeAdapterProvider allows ValidationAttribute's sub-classes. (#14074)

This permits to inherit built-in ValidationAttribute classes (ie RegularExpressionValidationAttribute, ...) while keeping the standard behavior.

Fixes https://github.com/aspnet/AspNetCore/issues/13782
This commit is contained in:
neilbgr 2019-09-17 23:33:04 +02:00 committed by Pranav K
parent 2de6c732d1
commit 3ec6f86c11
2 changed files with 24 additions and 12 deletions

View File

@ -29,51 +29,51 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations
var type = attribute.GetType(); var type = attribute.GetType();
if (type == typeof(RegularExpressionAttribute)) if (typeof(RegularExpressionAttribute).IsAssignableFrom(type))
{ {
adapter = new RegularExpressionAttributeAdapter((RegularExpressionAttribute)attribute, stringLocalizer); adapter = new RegularExpressionAttributeAdapter((RegularExpressionAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(MaxLengthAttribute)) else if (typeof(MaxLengthAttribute).IsAssignableFrom(type))
{ {
adapter = new MaxLengthAttributeAdapter((MaxLengthAttribute)attribute, stringLocalizer); adapter = new MaxLengthAttributeAdapter((MaxLengthAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(RequiredAttribute)) else if (typeof(RequiredAttribute).IsAssignableFrom(type))
{ {
adapter = new RequiredAttributeAdapter((RequiredAttribute)attribute, stringLocalizer); adapter = new RequiredAttributeAdapter((RequiredAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(CompareAttribute)) else if (typeof(CompareAttribute).IsAssignableFrom(type))
{ {
adapter = new CompareAttributeAdapter((CompareAttribute)attribute, stringLocalizer); adapter = new CompareAttributeAdapter((CompareAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(MinLengthAttribute)) else if (typeof(MinLengthAttribute).IsAssignableFrom(type))
{ {
adapter = new MinLengthAttributeAdapter((MinLengthAttribute)attribute, stringLocalizer); adapter = new MinLengthAttributeAdapter((MinLengthAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(CreditCardAttribute)) else if (typeof(CreditCardAttribute).IsAssignableFrom(type))
{ {
adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-creditcard", stringLocalizer); adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-creditcard", stringLocalizer);
} }
else if (type == typeof(StringLengthAttribute)) else if (typeof(StringLengthAttribute).IsAssignableFrom(type))
{ {
adapter = new StringLengthAttributeAdapter((StringLengthAttribute)attribute, stringLocalizer); adapter = new StringLengthAttributeAdapter((StringLengthAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(RangeAttribute)) else if (typeof(RangeAttribute).IsAssignableFrom(type))
{ {
adapter = new RangeAttributeAdapter((RangeAttribute)attribute, stringLocalizer); adapter = new RangeAttributeAdapter((RangeAttribute)attribute, stringLocalizer);
} }
else if (type == typeof(EmailAddressAttribute)) else if (typeof(EmailAddressAttribute).IsAssignableFrom(type))
{ {
adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-email", stringLocalizer); adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-email", stringLocalizer);
} }
else if (type == typeof(PhoneAttribute)) else if (typeof(PhoneAttribute).IsAssignableFrom(type))
{ {
adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-phone", stringLocalizer); adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-phone", stringLocalizer);
} }
else if (type == typeof(UrlAttribute)) else if (typeof(UrlAttribute).IsAssignableFrom(type))
{ {
adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-url", stringLocalizer); adapter = new DataTypeAttributeAdapter((DataTypeAttribute)attribute, "data-val-url", stringLocalizer);
} }
else if (type == typeof(FileExtensionsAttribute)) else if (typeof(FileExtensionsAttribute).IsAssignableFrom(type))
{ {
adapter = new FileExtensionsAttributeAdapter((FileExtensionsAttribute)attribute, stringLocalizer); adapter = new FileExtensionsAttributeAdapter((FileExtensionsAttribute)attribute, stringLocalizer);
} }

View File

@ -41,6 +41,10 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations
{ {
new RequiredAttribute(), new RequiredAttribute(),
typeof(RequiredAttributeAdapter) typeof(RequiredAttributeAdapter)
},
{
new CustomRegularExpressionAttribute("abc"),
typeof(RegularExpressionAttributeAdapter)
} }
}; };
} }
@ -85,5 +89,13 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations
var dataTypeAdapter = Assert.IsType<DataTypeAttributeAdapter>(adapter); var dataTypeAdapter = Assert.IsType<DataTypeAttributeAdapter>(adapter);
Assert.Equal(expectedRuleName, dataTypeAdapter.RuleName); Assert.Equal(expectedRuleName, dataTypeAdapter.RuleName);
} }
class CustomRegularExpressionAttribute : RegularExpressionAttribute
{
public CustomRegularExpressionAttribute(string pattern) : base(pattern)
{
ErrorMessage = "Not valid.";
}
}
} }
} }