类属性的自定义API ValidationAttribute

时间:2018-02-21 02:18:31

标签: c# asp.net validationattribute

我有一个学生类,其中包含属性'TextPair'列表,如下所示:

public class Student
{
    public List<TextPair> Hobbies { get; set; }
    public List<TextPair> Languages { get; set; }
    public List<TextPair> Majors { get; set; }

}

public class TextPair
{
    [StringLength(2, ErrorMessage = "The value length is invalid")]
    public string Value { get; set; }

    public string Text { get; set; }
}

在这里,我使用StringLength AttributeValidator验证最大长度为2的值,并在TextPair模型中的属性“Value”中进行修饰。 对我来说问题是长度总是固定的,长度总是强制性的。

在我的用例中,我想在应用程序的不同部分(或相同类型的不同属性)中使用不同的Value来支持不同的长度。

我正在寻找下面的内容,我可以在我的课程中通过验证,我声明我的属性'TextPair' [即我不想总是强制验证,也不想硬编码值2]

public class Student
{
    //Any length of the value is accepted for hobbies
    public List<TextPair> Hobbies{ get; set; }

    [ValuesLength(Length = 2, ErrorMessage = "Language code length must be 2 characters max")]
    public List<TextPair> Languages { get; set; }

    [ValuesLength(Length = 128, ErrorMessage = "The major should be within 128 characters length")]
    public List<TextPair> Majors{ get; set; }

}

有没有有效的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

也许尝试继承StringLengthAttribute来创建所需的ValuesLength属性。请注意,此代码未经过测试,只是最终实施的建议。

public class ValuesLength : StringLengthAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var isValid = true;

        var pair = value as TextPair;
        if (pair != null && pair.Value != null)
        {
            var pairValue = pair.Value;
            isValid = pairValue.Length < MaximumLength && pairValue.Length > MinimumLength;
        }        

        return IsValid ? ValidationResult.Success : new ValidationResult(ErrorMessage);
    }
}

答案 1 :(得分:0)

接近的解决方案之一如下:

public class Student
{
    //Any length of the value is accepted for hobbies
    public List<TextPair> Hobbies{ get; set; }

    [ValuesLength(MaximumLength = 2, ErrorMessage = "Language code length must be 2 characters max")]
    public List<TextPair> Languages { get; set; }

    [ValuesLength(MaximumLength = 128, ErrorMessage = "The major should be within 128 characters length")]
    public List<TextPair> Majors{ get; set; }

}

我的自定义属性验证是检查列表并验证是否有任何元素值超出提供的长度:

public class ValuesLengthAttribute : ValidationAttribute
    {
        public int MaximumLength { get; set; }
        public override Boolean IsValid(object value)
        {
            Boolean isValid = true;
            var list = value as List<TextPair>;
            if (list != null && list.Count>0)
                foreach (var item in list)
                {
                    if (item.Value.Length > MaximumLength)
                        isValid = false;
                }

            return isValid;
        }
    }