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");
});
jemals herausgefunden? –
ich am Ende mein Problem auf die Lösung bei Verwendung von Ehrungen. Ich werde in Kürze eine Antwort schreiben. –