First step is to implement IClientValidatable interface in the FileTypesAttribute class:
public class FileTypesAttribute : ValidationAttribute, IClientValidatable { private readonly ListThings to note here are the validationtype="filetypes" and the added parameter="types", which can be observed in the emitted html below:_types; private readonly string specifiedTypes; public FileTypesAttribute(string types) { _types = types.Split(',').ToList(); specifiedTypes = types; } public override bool IsValid(object value) { if (value == null) return true; var postedFile = value as HttpPostedFileBase; var fileExt = System.IO.Path.GetExtension(postedFile.FileName).Substring(1); return _types.Contains(fileExt, StringComparer.OrdinalIgnoreCase); } public override string FormatErrorMessage(string name) { return string.Format("Invalid file type. Only {0} are supported.", String.Join(", ", _types)); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationType = "filetypes"; rule.ValidationParameters.Add("types", specifiedTypes); yield return rule; } }
<input data-val="true" data-val-filetypes="Invalid file type. Only xls, xlsx are supported." data-val-filetypes-types="xls,xlsx" data-val-required="The AttachmentTrace field is required." id="AttachmentTrace" name="AttachmentTrace" type="file" value="" />The added parameter called types has a value of "xls,xlsx". This parameter and validationtype are significant because it will be used for the jquery validator and adapter as follows:
$(function () { // custom validation method $.validator.addMethod("filetypes", function (value, element, params) { if (value == null) return true; var fileExtension = value.split('.').pop().toLowerCase(); var types = params.toLowerCase(); return types.indexOf(fileExtension) !== -1; } ); // add to unobtrusive adapters $.validator.unobtrusive.adapters.addSingleVal("filetypes", "types"); } (jQuery));The value has the contents of the input element, while params has the parameter value of "xls,xlsx" from the data annotation.
No comments:
Post a Comment