Я создал собственный валидатор следующим образом:
public class IntArrayRequiredAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if ((!(value is int[] array) || !array.Any() || array.Any(item => item == 0)))
return new ValidationResult(this.ErrorMessage);
return ValidationResult.Success;
}
}
и применил его к свойству модели:
[IntArrayRequiredAttribute(ErrorMessage = "You must select {0}.")]
[Display(Name = "Rol")]
public int[] Roles { get; set; }
Хорошо, когда проверка не пройдена, эта ошибка отображается:
"You must select {0}."
Как вернуть сообщение об ошибке, чтобы {0} автоматически заменялось отображаемым именем поля, например, встроенными валидаторами?
Ожидаемый результат должен быть "You must select Rol."
РЕДАКТИРОВАТЬ:
Посмотрев исходный код ValidationAttribute, я прочитал:
public ValidationResult GetValidationResult(object value, ValidationContext validationContext) {
if (validationContext == null) {
throw new ArgumentNullException("validationContext");
}
ValidationResult result = this.IsValid(value, validationContext);
// If validation fails, we want to ensure we have a ValidationResult that guarantees it has an ErrorMessage
if (result != null) {
bool hasErrorMessage = (result != null) ? !string.IsNullOrEmpty(result.ErrorMessage) : false;
if (!hasErrorMessage) {
string errorMessage = this.FormatErrorMessage(validationContext.DisplayName);
result = new ValidationResult(errorMessage, result.MemberNames);
}
}
return result;
}
Я увидел, что он вызывает мой переопределенный метод IsValid и это форматирует сообщение. Почему это не форматирование в моем случае?
Если я использую перегрузку IsValid, она форматируется правильно, однако мне нужно использовать этот метод, потому что мне нужен validationContext для других целей проверки.