Пользовательский API ValidationAttribute для свойства класса

У меня есть класс Student, который содержит список свойств 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; }
}

Здесь я проверяю значение для максимальной длины 2 с помощью StringLength AttributeValidator и декорирую в свойстве "Значение" внутри модели TextPair. Проблема для меня в том, что длина всегда фиксирована, а длина всегда обязательна.

В моем случае использования я хочу, чтобы разные значения 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 ответа

Решение

Одно из подходов к решению заключается в следующем:

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

Может быть, попробовать подклассы 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);
    }
}
Другие вопросы по тегам