文件上传,客户端脚本没有调用? 数据注释

在我的MVC Web应用程序中,我有一个带有imageupload组件的表单。 imageupload图像数据在数据注释的帮助下得到validation。 我的服务器端validation是WORKING,但我的客户端jQuery函数没有被调用…我不知道为什么 – 帮助:

1.在我的视图中上传文件:

@Scripts.Render("~/bundles/jquery") @Scripts.Render("~/Scripts/jquery.validate.min.js") @Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")  
@Html.ValidationMessageFor(model => model.FileUploader, "", new { @class = "text-danger" })

在我的模型中,我有这个:

 [ValidImageUpload] public IEnumerable FileUploader { get; set; } 

3.ValidImageUpload文件:

 public sealed class ValidImageUpload : ValidationAttribute, IClientValidatable { string[] stringArray = { "gif", "jpg", "png", "jpeg" }; protected override ValidationResult IsValid(object value, ValidationContext validationContext) { IEnumerable uploadedFiles = (IEnumerable)value; var firstfile = uploadedFiles.FirstOrDefault(); if (firstfile != null) { foreach (var file in uploadedFiles) { int pos = Array.IndexOf(stringArray, file.ContentType.Substring(6)); if (pos > -1) { if (file.ContentLength > 5242880) { return new ValidationResult(String.Format("Billedet: {0} er for stort. (Max. tilladt billede-størrelse xxxxx)", file.FileName)); } } else { return new ValidationResult(String.Format("Billedt: {0} har et forkert format. Tilladte formater er - GIF, JPG, PNG, JPEG", file.FileName)); } } } return ValidationResult.Success; } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { ModelClientValidationRule mvr = new ModelClientValidationRule(); mvr.ErrorMessage = "Forkert format"; mvr.ValidationType = "validImageUpload"; return new[] { mvr }; } } 

jQuery的

 $(document).ready(function () { jQuery.validator.addMethod('validImageUpload', function (value, element, params) { var currentDate = new Date(); alert('Working indsi´side'); return false; }, ''); jQuery.validator.unobtrusive.adapters.add('validImageUpload', function (options) { options.rules['validImageUpload'] = {}; options.messages['validImageUpload'] = options.message; }); }); 

您没有获得任何客户端validation的原因是您没有在html中添加适当的data-val-*属性。 在您的情况下,始终使用强类型HtmlHelper方法生成您的html

 @Html.TextBoxFor(m => m.FileUploader, new { type="file", multiple="multiple"}) 

在内部,该方法从validation属性中读取元数据,并将适当的属性添加到html。 首次呈现页面时, jquery.validate.unobtrusive.js文件将读取这些属性的值,并将规则添加到jquery.valdate.js以进行客户端validation。

但是,您实施时还有其他一些问题。 validation2个单独的东西 – 文件大小和文件类型 – 因此您需要2个单独的属性。 并且您的属性不灵活,因为您已将有效值硬编码到代码中(您必须重复所有代码以将其应用于您只想允许说.pdf文件的另一个属性)。 您也不会在GetClientValidationRules()方法中返回任何参数来指示哪些文件类型(或文件大小)有效。 并且javascript函数不应该在document.ready()

对于FileTypeAttribute的实现,请参阅FileExtensionvalidation使用自定义validation创建重复和无效的data- *属性 。 对于FileSizeAttribute的实现,请参阅ASP.NET MVC中的客户端文件上载大小validation (请注意,该解决方案适用于单个文件,需要进行修改才能上载多个文件)。

我还建议您的研究ASP.NET MVC 3中的完整指南validation – 第2部分 。