Не запускаются пользовательские атрибуты проверки основного файла ASP.NET - PullRequest
0 голосов
/ 08 октября 2019

Я хочу проверить файлы в моем приложении, используя серверную часть, и пользовательскую логику, используя атрибуты.

у меня есть эта модель

public class FileTest {

        [Required]
        [DataType(DataType.Upload)]
        [MaxFileSize(3 * 1024 * 1024)]
        [AllowedExtensions(new string[] { ".pdf" })]
        public IFormFile File { set; get; }
}

вот пользовательские атрибуты

    public class MaxFileSizeAttribute : ValidationAttribute
    {
        private readonly int _maxFileSize;
        public MaxFileSizeAttribute(int maxFileSize)
        {
            _maxFileSize = maxFileSize;
        }

        protected override ValidationResult IsValid(    
        object value, ValidationContext validationContext)
        {
            var file = value as IFormFile;
            //var extension = Path.GetExtension(file.FileName);
            //var allowedExtensions = new[] { ".jpg", ".png" };`enter code here`
            if (file != null)
            {
                if (file.Length > _maxFileSize)
                {
                    return new ValidationResult(GetErrorMessage());
                }
            }

            return ValidationResult.Success;
        }

        public string GetErrorMessage()
        {
            return $"Maximum allowed file size is { _maxFileSize} bytes.";
        }
    }



    public class AllowedExtensionsAttribute : ValidationAttribute
    {
        private readonly string[] _Extensions;
        public AllowedExtensionsAttribute(string[] Extensions)
        {
            _Extensions = Extensions;
        }

        protected override ValidationResult IsValid(
        object value, ValidationContext validationContext)
        {
            var file = value as IFormFile;
            var extension = Path.GetExtension(file.FileName);
            if (!(file == null))
            {
                if (!_Extensions.Contains(extension.ToLower()))
                {
                    return new ValidationResult(GetErrorMessage());
                }
            }

            return ValidationResult.Success;
        }

        public string GetErrorMessage()
        {
            return $"This photo extension is not allowed!";
        }
    }

в основном, всякий раз, когда я публикую форму

<form method="post" enctype="multipart/form-data">
 <input asp-for="FileTest.File" class="form-control" multiple>
                                    <span asp-validation-for="Definition.File" class="text-danger"> 
                                    </span>
<button type=""submit">Submit</button>
</form>

модель страницы

public async Task<IActionResult> OnPostAsync()
{

    if(!ModelState.IsValid){
    }

    return Page();

}

Файл не становится недействительным, например, если я загружаю файл Excel, он обходит состояние модели. Используя отладчик, он не запускает настраиваемые атрибуты проверки, он сразу переходит к Post Handler

EDIT

Я забыл упомянуть, что это бритва. На моей бритвенной странице все, что у меня есть, это

public FileTest File { get; set; }

Согласно @KirkLatin, в проблеме отсутствовал BindProperty. Атрибуты проверки не запускаются, если этот тег отсутствует. Узнал что-то новое!

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