DataAnnotations的FileExtensions属性在MVC中不起作用

我试图在MVC中使用HTML FileUpload控件上传文件。 我想validation该文件只接受特定的扩展名。 我已经尝试使用DataAnnotations命名空间的FileExtensions属性,但它不起作用。 见下面的代码 –

public class FileUploadModel { [Required, FileExtensions(Extensions = (".xlsx,.xls"), ErrorMessage = "Please select an Excel file.")] public HttpPostedFileBase File { get; set; } } 

在控制器中,我正在编写如下代码 –

 [HttpPost] public ActionResult Index(FileUploadModel fileUploadModel) { if (ModelState.IsValid) fileUploadModel.File.SaveAs(Path.Combine(Server.MapPath("~/UploadedFiles"), Path.GetFileName(fileUploadModel.File.FileName))); return View(); } 

在View中,我写了下面的代码 –

 @using (Html.BeginForm("Index", "FileParse", FormMethod.Post, new { enctype = "multipart/form-data"} )) { @Html.Label("Upload Student Excel:")   @Html.ValidationMessageFor(m => m.File) } 

当我运行应用程序并提供无效的文件扩展名时,它没有显示错误消息。 我知道编写自定义validation属性的解决方案,但我不想使用自定义属性。 请指出我出错的地方。

我遇到了同样的问题,我决定创建一个新的ValidationAttribute。

像这样:

  [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class FileExtensionsAttribute : ValidationAttribute { private List AllowedExtensions { get; set; } public FileExtensionsAttribute(string fileExtensions) { AllowedExtensions = fileExtensions.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); } public override bool IsValid(object value) { HttpPostedFileBase file = value as HttpPostedFileBase; if (file != null) { var fileName = file.FileName; return AllowedExtensions.Any(y => fileName.EndsWith(y)); } return true; } } 

现在,只需使用:

 [FileExtensions("jpg,jpeg,png,gif", ErrorMessage = "Your error message.")] public HttpPostedFileBase Imagem { get; set; } 

我帮了。 拥抱!

FileExtensions属性不知道如何validationHttpPostedFileBase。 请尝试以下

 [FileExtensions(Extensions = "xlsx|xls", ErrorMessage = "Please select an Excel file.")] public string Attachment{ get; set; } 

在你的控制器中:

 [HttpPost] public ActionResult Index(HttpPostedFileBase Attachment) { if (ModelState.IsValid) { if (Attachment.ContentLength > 0) { string filePath = Path.Combine(HttpContext.Server.MapPath("/Content/Upload"), Path.GetFileName(Attachment.FileName)); Attachment.SaveAs(filePath); } } return RedirectToAction("Index_Ack"}); } 

与marai回答一样,FileExtension属性仅适用于字符串属性。

在我的代码中,我使用如下属性:

 public class MyViewModel { [Required] public HttpPostedFileWrapper PostedFile { get; set; } [FileExtensions(Extensions = "zip,pdf")] public string FileName { get { if (PostedFile != null) return PostedFile.FileName; else return ""; } } } 

然后,在服务器端,如果postedfile没有您在属性中指定的扩展名(在我的示例中为.zip和.pdf),则ModelState.IsValid将为false。

注意:如果您使用HTML.ValidationMessageFor帮助程序在PostBack之后呈现错误消息(文件扩展名属性未在客户端validation,仅在服务器端validation),则需要为FileName属性指定另一个帮助程序以显示扩展错误消息:

 @Html.ValidationMessageFor(m => m.PostedFile) @Html.ValidationMessageFor(m => m.FileName) 

我在DataAnnotations的FileExtensions属性中使用了上面的代码, 而不是在MVC中工作 ,我只做了几处更改:1)避免命名空间冲突和2)使用IFormFile而不是原始的HttpPostedFileBase。 好吧,也许对某人有用。

我的代码:

 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class FileVerifyExtensionsAttribute : ValidationAttribute { private List AllowedExtensions { get; set; } public FileVerifyExtensionsAttribute(string fileExtensions) { AllowedExtensions = fileExtensions.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList(); } public override bool IsValid(object value) { IFormFile file = value as IFormFile; if (file != null) { var fileName = file.FileName; return AllowedExtensions.Any(y => fileName.EndsWith(y)); } return true; } }