我希望尝试将几个验证器连接到同一个验证器中,以避免遗漏验证器。
考虑,只是一个例子,我有一个我希望验证的字符串类型的Id字段。
我需要应用几个验证器,例如Required
,MaxLength
,MinLength
和其他一些解析器。
现在,为了使它更有趣,我想在我的所有Id字段中添加EmailAddress
验证,所以我依赖验证器已经存在的事实,所以我只想将它添加到验证组。
我有很多带有Id的模型,我想制作一些新的验证器,它实际上可以验证几件事情,所以它更容易在字段上应用验证器。
无法找到相关内容。
让我们看一个例子:(忽略它会失败的事实......只是为了得到这个想法)
[Required]
[EmailAddress]
[StringLength(6)]
[MinLength(5)]
[CustomA]
[CustomB]
public string Id { get; set; }
我想简单写一下
[IdValidator]
public string Id { get; set; }
并且在其他地方,IdValidator将在我决定更改它时验证所有这些以及更多/更少。 我希望改变只发生在一个地方。
答案 0 :(得分:3)
您可以create custom data validation attribute并实施所需的行为:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class IdentifierValidationAttribute : ValidationAttribute
{
public int MinLength { get; set; }
public int MaxLength { get; set; }
public IdentifierValidationAttribute(int minLength, int maxLength)
{
MinLength = minLength;
MaxLength = maxLength;
}
public override bool IsValid(object value)
{
var stringValue = value as string;
if(string.IsNullOrEmpty(stringValue))
return false;
var length = stringValue.Length;
if(length > MaxLength || length < MinLength)
return false;
return true;
}
}
您还可以创建下一个复合属性:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public sealed class IdentifierValidationAttribute : ValidationAttribute
{
private readonly ValidationAttribute[] attributes;
public IdentifierValidationAttribute(int minLength, int maxLength)
{
attributes = new ValidationAttribute[] { new EmailAddressAttribute(), new MinLengthAttribute(minLength), new MaxLengthAttribute(maxLength) };
}
public override bool IsValid(object value)
{
return attributes.All(a => a.IsValid(value));
}
}
答案 1 :(得分:3)
为什么不创建自己的分组属性?您可以将所需的属性添加到_attributes
数组。
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
sealed public class GroupedValidationAttribute : ValidationAttribute, IClientValidatable
{
private readonly ValidationAttribute[] _attributes;
public GroupedValidationAttribute(int minLength, int maxLength)
{
_attributes = new ValidationAttribute[]
{
new RequiredAttribute(),
new EmailAddressAttribute(),
new StringLengthAttribute(maxLength),
new MinLengthAttribute(minLength),
new CustomAAttribute(),
new CustomBAttribute()
};
}
public override bool IsValid(object value)
{
return _attributes.All(a => a.IsValid(value));
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
return _attributes
.OfType<IClientValidatable>()
.SelectMany(x => x.GetClientValidationRules(metadata, context));
}
}