c#数据注释分组

时间:2016-03-03 08:17:27

标签: c# asp.net-mvc-4

我希望尝试将几个验证器连接到同一个验证器中,以避免遗漏验证器。

考虑,只是一个例子,我有一个我希望验证的字符串类型的Id字段。 我需要应用几个验证器,例如RequiredMaxLengthMinLength和其他一些解析器。 现在,为了使它更有趣,我想在我的所有Id字段中添加EmailAddress验证,所以我依赖验证器已经存在的事实,所以我只想将它添加到验证组。

我有很多带有Id的模型,我想制作一些新的验证器,它实际上可以验证几件事情,所以它更容易在字段上应用验证器。

无法找到相关内容。

让我们看一个例子:(忽略它会失败的事实......只是为了得到这个想法)

[Required]
[EmailAddress]
[StringLength(6)]
[MinLength(5)]
[CustomA]
[CustomB]
public string Id { get; set; }

我想简单写一下

[IdValidator]
public string Id { get; set; }

并且在其他地方,IdValidator将在我决定更改它时验证所有这些以及更多/更少。 我希望改变只发生在一个地方。

2 个答案:

答案 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));
    }
}