Я хочу проверить файлы в моем приложении, используя серверную часть, и пользовательскую логику, используя атрибуты.
у меня есть эта модель
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. Атрибуты проверки не запускаются, если этот тег отсутствует. Узнал что-то новое!