如何使用 DataAnnotations 使用多个文件扩展名?
How to use multiple file extensions using DataAnnotations?
例如,下面的代码工作正常:
[Required(ErrorMessage = "Choose an image"),
FileExtensions(Extensions = "jpg", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
但我需要更多扩展。我尝试只添加几种格式,但它不起作用:
"jpg, gif, png"
或 "*.jpg, *.gif, *.png"
或 "GIF|*.gif|JPG|*.jpg;*.jpeg|PNG|*.png"
等等。是否可以使用更多文件扩展名?
这样使用:
[Required(ErrorMessage = "Choose an image"),
FileExtensions(Extensions = "jpg,jpeg,gif,png", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
扩展名需要用逗号分隔并且不能有空格(空格将被视为扩展名的一部分),所以这应该有效:
[Required(ErrorMessage = "Choose an image"),
FileExtensions(Extensions = "jpg,gif,png", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
这只适用于一个文件扩展名,它适用于 "HttpPostedFileBase" 和 "string" 属性 类型,并且只适用于服务器端(所以它在文件后告诉结果已上传!):
FileExtensions(Extensions = "jpg", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
所以如果你这样做,它永远不会起作用:
FileExtensions(Extensions = "jpg,gif,png", ErrorMessage = "Error")]
FileExtensions(Extensions = "jpg|gif|png", ErrorMessage = "Error")]
FileExtensions(Extensions = "jpg gif png", ErrorMessage = "Error")]
etc...
通过 DataAnnotations 使用多个文件扩展名的真正方法是创建一个简单的自定义验证属性!
第 1 步:在任何地方创建一个文件夹,随便起一个名字,创建一个 class 给它起个名字哈哈
YOUR_SOLUTION_NAME\Models\CustomValidation\ValidImageFileAttribute.cs
第 2 步:让它看起来像这样,您可以将 isValid 方法中的代码更改为您需要的任何代码
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Web;
namespace YOUR_SOLUTION_NAME.Models.CustomValidation
{
public class ValidImageFileAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null)
return false;
string[] _validExtensions = { "JPG", "JPEG", "BMP", "GIF", "PNG" };
var file = (HttpPostedFileBase)value;
var ext = Path.GetExtension(file.FileName).ToUpper().Replace(".", "");
return _validExtensions.Contains(ext) && file.ContentType.Contains("image");
}
}
}
第 3 步:在您的模型中使用自定义验证
namespace YOUR_SOLUTION_NAME.Models
{
public class testModel
{
[Required(ErrorMessage = "Please attached the personal photo")]
[ValidImageFile(ErrorMessage = "The file is not a valid image file")]
public HttpPostedFileBase File { get; set; }
}
}
第 4 步:在视图中使用模型
@model FacilityMvcApp.Models.testModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.TextBoxFor(Model => Model.File, new { type = "file" })
@Html.ValidationMessageFor(model => model.File ,null, new { @class = "text-danger" })
</div>
</div>
}
第 5 步:watch this tutorial了解有关自定义验证的更多信息
例如,下面的代码工作正常:
[Required(ErrorMessage = "Choose an image"),
FileExtensions(Extensions = "jpg", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
但我需要更多扩展。我尝试只添加几种格式,但它不起作用:
"jpg, gif, png"
或 "*.jpg, *.gif, *.png"
或 "GIF|*.gif|JPG|*.jpg;*.jpeg|PNG|*.png"
等等。是否可以使用更多文件扩展名?
这样使用:
[Required(ErrorMessage = "Choose an image"),
FileExtensions(Extensions = "jpg,jpeg,gif,png", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
扩展名需要用逗号分隔并且不能有空格(空格将被视为扩展名的一部分),所以这应该有效:
[Required(ErrorMessage = "Choose an image"),
FileExtensions(Extensions = "jpg,gif,png", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
这只适用于一个文件扩展名,它适用于 "HttpPostedFileBase" 和 "string" 属性 类型,并且只适用于服务器端(所以它在文件后告诉结果已上传!):
FileExtensions(Extensions = "jpg", ErrorMessage = "Error")]
public HttpPostedFileBase BannerData { get; set; }
所以如果你这样做,它永远不会起作用:
FileExtensions(Extensions = "jpg,gif,png", ErrorMessage = "Error")]
FileExtensions(Extensions = "jpg|gif|png", ErrorMessage = "Error")]
FileExtensions(Extensions = "jpg gif png", ErrorMessage = "Error")]
etc...
通过 DataAnnotations 使用多个文件扩展名的真正方法是创建一个简单的自定义验证属性!
第 1 步:在任何地方创建一个文件夹,随便起一个名字,创建一个 class 给它起个名字哈哈
YOUR_SOLUTION_NAME\Models\CustomValidation\ValidImageFileAttribute.cs
第 2 步:让它看起来像这样,您可以将 isValid 方法中的代码更改为您需要的任何代码
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Web;
namespace YOUR_SOLUTION_NAME.Models.CustomValidation
{
public class ValidImageFileAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null)
return false;
string[] _validExtensions = { "JPG", "JPEG", "BMP", "GIF", "PNG" };
var file = (HttpPostedFileBase)value;
var ext = Path.GetExtension(file.FileName).ToUpper().Replace(".", "");
return _validExtensions.Contains(ext) && file.ContentType.Contains("image");
}
}
}
第 3 步:在您的模型中使用自定义验证
namespace YOUR_SOLUTION_NAME.Models
{
public class testModel
{
[Required(ErrorMessage = "Please attached the personal photo")]
[ValidImageFile(ErrorMessage = "The file is not a valid image file")]
public HttpPostedFileBase File { get; set; }
}
}
第 4 步:在视图中使用模型
@model FacilityMvcApp.Models.testModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.TextBoxFor(Model => Model.File, new { type = "file" })
@Html.ValidationMessageFor(model => model.File ,null, new { @class = "text-danger" })
</div>
</div>
}
第 5 步:watch this tutorial了解有关自定义验证的更多信息