DataAnnotations的FileExtensions属性在MVC中不起作用
本文关键字:MVC 不起作用 属性 FileExtensions DataAnnotations | 更新日期: 2023-09-27 18:02:21
我试图在MVC中使用HTML FileUpload控件上传文件。我想验证该文件只接受特定的扩展名。我试过使用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:")
<input type="file" name="file" id="file"/>
<input type="submit" value="Import"/>
@Html.ValidationMessageFor(m => m.File)
}
当我运行应用程序并给出无效的文件扩展名时,它不会显示错误消息。我知道编写自定义验证属性的解决方案,但我不想使用自定义属性。请指出我错在哪里
我有同样的问题,我解决了创建一个新的ValidationAttribute。
:
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FileExtensionsAttribute : ValidationAttribute
{
private List<string> 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; }
我帮了忙。拥抱!
就像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 "";
}
}
}
然后,在服务器端,ModelState。如果postdfile没有你在属性中指定的后缀(在我的例子中是.zip和.pdf), IsValid将为false。
注意:如果您使用HTML.ValidationMessageFor
帮助器在PostBack后呈现错误消息(文件扩展名属性在客户端无效,仅在服务器端有效),您需要为FileName
属性指定另一个帮助器,以便显示扩展名错误消息:
@Html.ValidationMessageFor(m => m.PostedFile)
@Html.ValidationMessageFor(m => m.FileName)
FileExtensions属性不知道如何验证HttpPostedFileBase。请在下面尝试
[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"});
}
我在DataAnnotations的FileExtensions属性中使用了上面的代码,而不是在MVC中工作,我只是做了一些更改:1)避免名称空间冲突和2)使用IFormFile而不是原来的HttpPostedFileBase。嗯,也许对某人有用。
我代码:[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FileVerifyExtensionsAttribute : ValidationAttribute
{
private List<string> 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;
}
}