Я хочу реализовать собственный валидатор модели.Я использовал пример кода из книги Pro ASP .NET Core MVC, и он не работает.Пользовательский метод проверки модели никогда не вызывается, но проверка модели прошла успешно.
Подпись метода действия:
[HttpPost] public IActionResult EditPerson(Person model, int id, **[ImageValidator]IFormFile file**)
Важным объектом является параметр file .
Внутри метода действия я использую следующую проверку, которая всегда оценивает значение true, когда параметр файла присутствует, даже если валидатор должен сказать, что он недопустим (слишком большой, неправильный формат atc ..):
if (ModelState.GetValidationState(nameof(file)) == Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState.Valid) {...}
Валидатор модели выглядит так:
public class ImageValidatorAttribute : Attribute, IModelValidator {
public bool IsRequired => true;
// Max size of image in kilo Bytes
public int MaxSize { get; set; } = 1024;
// Allowed extensions
public string Extensions { get; set; } = ".jpg .jpeg";
public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
{
**throw new NotImplementedException();**
IFormFile file = context.Model as IFormFile;
List<ModelValidationResult> result = new List<ModelValidationResult>();
if (file != null) {
......some code here....
}
return result;
}
}
Моя проблема в том, что выполнение никогда не достигает пользовательского валидатора, который проверяется как точкой останова, так и новой строкой Exception ().
Чего мне не хватает?Спасибо за предложения!J
РЕДАКТИРОВАТЬ: Я также пытался с объектом ValidationAttribute:
public class SizeAttribute : ValidationAttribute
{
private int size;
public SizeAttribute(int Size) => size = Size;
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
IFormFile file = validationContext.ObjectInstance as IFormFile;
if (size * 1024 < file.Length) return new ValidationResult($"A maximum image size of only {size}KB is allowed");
else return ValidationResult.Success;
}
}
И здесь у меня есть метод действия
[HttpPost] public IActionResult EditPerson(Person model, int id, [Size(1024)]IFormFile file)
Проверка по-прежнему неиметь место