Пользовательский 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);
}
}