0

我想在MVC-6 RC2定制的jQuery不显眼的验证ASP.NET RC2 IFormFile文件扩展名和文件最大尺寸自定义验证

类似于在 Old Answer我看到This one一些RC2例子,但我不知道知道如何为文件实现它。

这里是我的视图模式

public class FileUploadViewModel 
    { 
     //TODO [FileType(Validtype="jpeg,png,jif", MaxSize=112222)]// this is what I want 
     [Required(ErrorMessage = "Please select a file")] 
     public IFormFile File { get; set; } 

     [Required(ErrorMessage = "Please select link")] 
     public string FileName { get; set; } 

     public string ExternalLink { get; set; } 

     public string Description { get; set; }  
    } 
+0

不断想出解决办法? –

+0

我结束了解决在使用我的问题贡品。我会很快发布答案。 –

回答

2

我结束了使用属性解决我的问题

这是我如何创建它。 (我的尺寸和扩展是静态的一样,通过我们的应用这就是为什么我硬编码它在FileTypeAttribute,但你可以把它的动态,并把它传递给,如果你想要的属性构造。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] 
    public class FileTypeAttribute : ValidationAttribute, IClientModelValidator 
    { 
     private const int MaxSize = 1048576; 
     private const string _DefaultErrorMessage = "Only the following file types are allowed: {0}"; 
     private IEnumerable<string> _ValidTypes { get; set; } 

     public string ValidTypes { get; set; } 

     public string ErrorMessageExtension { get; set; } 

     public string ErrorMessageSize { get; set; } 


     public FileTypeAttribute(string errorExtension, string errorSize) 
     { 
      ILang lang = ((ContextServiceImpl)ContextService.Instance).HttpContext.RequestServices.GetService(typeof(ILang)) as ILang; 
      ErrorMessageExtension = lang[errorExtension]; 
      ErrorMessageSize = lang[errorSize]; 

     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      IFormFile file = value as IFormFile; 
      if (file != null) 
      { 

       if (!_ValidTypes.Any(e => file.FileName.EndsWith(e))) 
       { 
        return new ValidationResult(ErrorMessageExtension); 
       } 
       if (file.Length > MaxSize) 
       { 
        return new ValidationResult(ErrorMessageSize); 
       } 
      } 

      return ValidationResult.Success; 
     } 

     public void AddValidation(ClientModelValidationContext context) 
     { 
      MergeAttribute(context.Attributes, "data-val", "true"); 
      var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName()); 
      MergeAttribute(context.Attributes, "data-val-fileextensions", ErrorMessageExtension); 
      MergeAttribute(context.Attributes, "data-val-maxfilesize", ErrorMessageSize); 
     } 

     private bool MergeAttribute(
     IDictionary<string, string> attributes, string key, string value) 
     { 
      if (attributes.ContainsKey(key)) 
      { 
       return false; 
      } 

      attributes.Add(key, value); 
      return true; 
     } 
    } 

然后我的观点里模型我使用属性如下

public class FileUploadViewModel 
    { 
     [FileType("invalid format", "invalid size")] 
     [Required(ErrorMessage = "Please select a file")] 
     public IFormFile File { get; set; } 

     [Required(ErrorMessage = "Please select link")] 
     public string FileName { get; set; } 

     public string ExternalLink { get; set; } 

     public string Description { get; set; }  
    } 

然后里面的javascript做到这一点

$.validator.addMethod("fileextensions", 
     function (value, element, param) { 
      var fileType = $(element)[0].files[0].type; 
      var fileTypes = ["image/jpeg", "image/pjpeg", "image/gif", "image/bmp", "image/png", "image/x-png", "image/tiff"] 
      var validExtension = $.inArray(type, fileTypes) !== -1; 
      return validExtension; 
    }); 

    $.validator.addMethod("maxfilesize", 
    function (value, element, param) { 

     var fileSize = $(element)[0].files[0].size; 
     var maxSize = 1048576; 

     var validSize = fileSize < maxSize; 
     return validSize; 
    }); 

    $.validator.unobtrusive.adapters.add('fileextensions', [], function (options) { 
     var params = { 
      fileextensions: $(options.element).data("val-fileextensions").split(',') 
     }; 

     options.rules['fileextensions'] = params;  
     options.messages['fileextensions'] = $(options.element).data("val-fileextensions"); 

    }); 

    $.validator.unobtrusive.adapters.add('maxfilesize', [], function (options) { 

     options.rules['maxfilesize'] = []; 
     options.messages['maxfilesize'] = $(options.element).data("val-maxfilesize"); 

    });