0

Ich möchte benutzerdefinierte Jquery unaufdringlich Validator in MVC-6 RC2ASP.NET RC2 IFormFile Dateierweiterung und Datei maximale Größe benutzerdefinierte Validierung

Ähnlich dem der Old Answer ich in This one einige RC2 Beispiele zu sehen, aber ich weiß nicht wissen, wie man es für Dateien implementiert.

Hier ist meine Ansicht Modus

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

jemals herausgefunden? –

+0

ich am Ende mein Problem auf die Lösung bei Verwendung von Ehrungen. Ich werde in Kürze eine Antwort schreiben. –

Antwort

2

Ich landete mein Problem, indem mithilfe von Attributen up Lösung

Hier ist, wie ich es erstellt. (Meine Größe und Erweiterungen sind statisch das gleiche durch unsere Anwendungs ​​das ist, warum ich es hart codiert in den FileTypeAttribute aber man kann es dynamisch gestalten und an das Attribute Konstruktor übergeben, wenn Sie wollen.

[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; 
     } 
    } 

dann in meiner Ansicht Modell ich das Attribut als

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; }  
    } 

Dann innen Javascript folgt tun, um diese

$.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"); 

    });