API class 属性 的自定义 API ValidationAttribute

Custom API ValidationAttribute for class property

我有一个 class 学生,其中包含 属性 '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' 中进行修饰。 我的问题是长度总是固定的,长度总是强制性的。

在我的用例中,我希望应用程序不同部分的不同风格的值(或者,相同类型的不同 属性)支持不同的长度。

我正在寻找类似下面的东西,我可以在我的 class 中通过验证,在那里我声明我的 属性 'TextPair' [IE。我不想总是强制验证,也不想硬编码值 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; }

}

有什么有效的方法来解决这个问题吗?

也许可以尝试子类化 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);
    }
}

其中一种解决方案如下:

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;
        }
    }