ASP.NET Core 2.1 MVC: объект IModelValidator не вызывается при привязке модели, почему? - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу реализовать собственный валидатор модели.Я использовал пример кода из книги 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)

Проверка по-прежнему неиметь место

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...