Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC 3:DataAnnotations.FileExtensionsAttribute不工作_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC 3:DataAnnotations.FileExtensionsAttribute不工作

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

根据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 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);
    }
}