Asp.net mvc 3 ASP.NET MVC 3:DataAnnotations.FileExtensionsAttribute不工作
根据MSDN文档,默认情况下,FileExtensionsAttribute(.NET 4.5)只允许我上传jpg、jpeg、gif和png文件,这正是我想要的 我试着上传一个没有属性的jpg,效果不错。伟大的然后 我已将该属性添加到视图模型中Asp.net mvc 3 ASP.NET MVC 3:DataAnnotations.FileExtensionsAttribute不工作,asp.net-mvc-3,Asp.net Mvc 3,根据MSDN文档,默认情况下,FileExtensionsAttribute(.NET 4.5)只允许我上传jpg、jpeg、gif和png文件,这正是我想要的 我试着上传一个没有属性的jpg,效果不错。伟大的然后 我已将该属性添加到视图模型中 [FileExtensions(ErrorMessage = "Please specify a valid image file (.jpg, .jpeg, .gif or .png)")] public HttpPostedFileBase Imag
[FileExtensions(ErrorMessage = "Please specify a valid image file (.jpg, .jpeg, .gif or .png)")]
public HttpPostedFileBase ImageFile { get; set; }
没有快乐。验证失败,显示错误消息。除此之外,似乎没有办法指定任何允许的自定义文件扩展名。
我最终扩展了FileExtensionsAttribute并使用了我自己的验证逻辑,它可以按预期工作。但是为什么这种方式不起作用呢
如果需要,将发布整个控制器和视图。我使用此示例作为上载逻辑的基础,但使用DataAnnotations.FileExtensionsAttribute而不是Microsoft.Web.Mvc.FileExtensions 使用属性设置它们。尽管根据文件
文件扩展名或默认文件扩展名(“.png”,
.jpg“、.jpeg”和“.gif”),如果未设置属性
您可以像设置
错误消息一样设置它。更可能的问题是,它不知道如何评估HttpPostedFileBase
是否具有正确的扩展名。您需要使用MVC框架中的文件或创建自己的文件。FileExtensionsAttribute不知道如何验证HttpPostedFileBase,因此我对其进行了扩展
/// <summary>
/// A File extensions attribute for verifying the file extensions of posted files from MVC forms.
/// </summary>
public class PostedFileBaseFileExtensionsAttribute : FileExtensionsAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var file = value as HttpPostedFileBase;
if (file == null)
{
return new ValidationResult("No File Specified");
}
return base.IsValid(file.FileName, validationContext);
}
}
因为System.ComponentModel.DataAnnotations.FileExtensionsAttribute是密封的。我使用MVC4的包装器
public class HttpPostedFileExtensionsAttribute : DataTypeAttribute, IClientValidatable
{
private readonly FileExtensionsAttribute _innerAttribute =
new FileExtensionsAttribute();
/// <summary>
/// Initializes a new instance of the <see cref="HttpPostedFileExtensionsAttribute" /> class.
/// </summary>
public HttpPostedFileExtensionsAttribute()
: base(DataType.Upload)
{
ErrorMessage = _innerAttribute.ErrorMessage;
}
/// <summary>
/// Gets or sets the file name extensions.
/// </summary>
/// <returns>
/// The file name extensions, or the default file extensions (".png", ".jpg", ".jpeg", and ".gif") if the property is not set.
/// </returns>
public string Extensions
{
get { return _innerAttribute.Extensions; }
set { _innerAttribute.Extensions = value; }
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ValidationType = "extension",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters["extension"] = _innerAttribute.Extensions;
yield return rule;
}
/// <summary>
/// Applies formatting to an error message, based on the data field where the error occurred.
/// </summary>
/// <returns>
/// The formatted error message.
/// </returns>
/// <param name="name">The name of the field that caused the validation failure.</param>
public override string FormatErrorMessage(string name)
{
return _innerAttribute.FormatErrorMessage(name);
}
/// <summary>
/// Checks that the specified file name extension or extensions is valid.
/// </summary>
/// <returns>
/// true if the file name extension is valid; otherwise, false.
/// </returns>
/// <param name="value">A comma delimited list of valid file extensions.</param>
public override bool IsValid(object value)
{
var file = value as HttpPostedFileBase;
if (file != null)
{
return _innerAttribute.IsValid(file.FileName);
}
return _innerAttribute.IsValid(value);
}
}
公共类HttpPostedFileExtensionsAttribute:DataTypeAttribute,IClientValidatable
{
私有只读文件扩展属性\u innerAttribute=
新建FileExtensionsAttribute();
///
///初始化类的新实例。
///
公共HttpPostedFileExtensionsAttribute()
:base(DataType.Upload)
{
ErrorMessage=\u innerAttribute.ErrorMessage;
}
///
///获取或设置文件扩展名。
///
///
///文件扩展名,或默认文件扩展名(“.png”、“.jpg”、“.jpeg”和“.gif”),如果未设置属性。
///
公共字符串扩展名
{
获取{return\u innerAttribute.Extensions;}
设置{u innerAttribute.Extensions=value;}
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据,
ControllerContext(上下文)
{
var规则=新ModelClientValidationRule
{
ValidationType=“扩展”,
ErrorMessage=FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters[“extension”]=\u innerAttribute.Extensions;
收益率-收益率规则;
}
///
///根据发生错误的数据字段,对错误消息应用格式设置。
///
///
///格式化的错误消息。
///
///导致验证失败的字段的名称。
公共重写字符串FormatErrorMessage(字符串名称)
{
返回_innerAttribute.FormatErrorMessage(名称);
}
///
///检查指定的文件扩展名是否有效。
///
///
///如果文件扩展名有效,则为true;否则为false。
///
///有效文件扩展名的逗号分隔列表。
公共覆盖布尔值有效(对象值)
{
var file=作为HttpPostedFileBase的值;
如果(文件!=null)
{
返回_innerAttribute.IsValid(file.FileName);
}
返回_innerAttribute.IsValid(值);
}
}
我知道这有点太晚了,但也许这可以帮助其他人。这是@jfeinour的一个修改版本,它也将在客户端上工作:
public class HttpPostedFileExtensionAttribute : ValidationAttribute, IClientValidatable {
private readonly FileExtensionsAttribute _fileExtensionsAttribute = new FileExtensionsAttribute();
public HttpPostedFileExtensionAttribute() {
ErrorMessage = _fileExtensionsAttribute.ErrorMessage;
}
public string Extensions {
get { return _fileExtensionsAttribute.Extensions; }
set { _fileExtensionsAttribute.Extensions = value; }
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
var rule = new ModelClientValidationRule {
ValidationType = "extension",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters["extension"] =
_fileExtensionsAttribute.Extensions
.Replace(" ", string.Empty).Replace(".", string.Empty)
.ToLowerInvariant();
yield return rule;
}
public override string FormatErrorMessage(string name) {
return _fileExtensionsAttribute.FormatErrorMessage(name);
}
public override bool IsValid(object value) {
var file = value as HttpPostedFileBase;
return _fileExtensionsAttribute.IsValid(file != null ? file.FileName : value);
}
}
公共类HttpPostedFileExtensionAttribute:ValidationAttribute,IClientValidatable{
私有只读FileExtensionsAttribute_FileExtensionsAttribute=new FileExtensionsAttribute();
公共HttpPostedFileExtensionAttribute(){
ErrorMessage=\u fileExtensionsAttribute.ErrorMessage;
}
公共字符串扩展名{
获取{return\u fileExtensionsAttribute.Extensions;}
设置{u fileExtensionsAttribute.Extensions=value;}
}
公共IEnumerable GetClientValidationRules(ModelMetadata元数据、ControllerContext上下文){
var规则=新ModelClientValidationRule{
ValidationType=“扩展”,
ErrorMessage=FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters[“扩展”]=
_fileExtensionsAttribute.Extensions
.Replace(“,string.Empty).Replace(“.”,string.Empty)
.ToLowerInvariant();
收益率-收益率规则;
}
公共重写字符串FormatErrorMessage(字符串名称){
返回_fileExtensionsAttribute.FormatErrorMessage(名称);
}
公共覆盖布尔值有效(对象值){
var file=作为HttpPostedFileBase的值;
返回_fileextensionAttribute.IsValid(file!=null?file.FileName:value);
}
}
谢谢。关于FileExtensionsAttribute,您是对的,不知道如何访问文件名。它似乎期望一个字符串作为参数进行验证。另外,我注意到错误消息是一个属性,而文件扩展名筛选器字符串只能设置为可选的构造函数参数(它是一个只读属性)。每个类的语法略有不同。FileExtensionsAttribute不是密封的吗?FileExtensionsAttribute类是密封的。所以这不能被继承是的它应该,由于它是
iclientvalidable
,因此它应该在html@bzlm-这与ASP.NET MVC5和更新的库的预期效果相同-这使用了更为最新的JQuery Valdiation库。尝试使用此包装器的本地化错误消息,但即使当ErrorMessageResourceT
public class HttpPostedFileExtensionAttribute : ValidationAttribute, IClientValidatable {
private readonly FileExtensionsAttribute _fileExtensionsAttribute = new FileExtensionsAttribute();
public HttpPostedFileExtensionAttribute() {
ErrorMessage = _fileExtensionsAttribute.ErrorMessage;
}
public string Extensions {
get { return _fileExtensionsAttribute.Extensions; }
set { _fileExtensionsAttribute.Extensions = value; }
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
var rule = new ModelClientValidationRule {
ValidationType = "extension",
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName())
};
rule.ValidationParameters["extension"] =
_fileExtensionsAttribute.Extensions
.Replace(" ", string.Empty).Replace(".", string.Empty)
.ToLowerInvariant();
yield return rule;
}
public override string FormatErrorMessage(string name) {
return _fileExtensionsAttribute.FormatErrorMessage(name);
}
public override bool IsValid(object value) {
var file = value as HttpPostedFileBase;
return _fileExtensionsAttribute.IsValid(file != null ? file.FileName : value);
}
}