MVC4和IClientValidatable – 自动AJAX调用服务器端validation

我想在MVC4中实现自定义客户端validation。 我目前使用标准属性,例如我的模型中的标准属性

public class UploadedFiles { [StringLength(255, ErrorMessage = "Path is too long.")] [Required(ErrorMessage = "Path cannot be empty.")] [ValidPath] public string SourceDirectory { get; set; } } 

所以StringLength和Required都会自动转换为一些JQuery客户端validation。 目前“有效路径”仅适用于服务器端。 validation将始终需要服务器端,因为只有服务器可以validation路径是否有效,您无法执行此客户端。

服务器端代码看起来像

 public class ValidPathAttribute : ValidationAttribute, IClientValidatable { public string SourceDirectory; protected override ValidationResult IsValid(object value, ValidationContext validationContext) { string path = value.ToString(); string message = string.Empty; var fileSystemSupport = new FileSystemSupport(Settings, new WrappedFileSystem(new FileSystem())); if (fileSystemSupport.ValidateNetworkPath(path, out message)) { return ValidationResult.Success; } return new ValidationResult(message); } } 

这很好用。 现在我希望通过ajax调用,“IClientValidatable”和“GetClientValidationRules”中的步骤来实现。 在我的书后,我写了

 public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationType = "validpath"; yield return rule; } 

我相信我现在必须编写一些自定义validation脚本代码,适配器(用于标识所需的元数据)和validation规则本身(validation器,由rule.ValidationType引用)。

我认为我不需要编写适配器,我可以使用

addBool – 为“on”或“off”的validation器规则创建适配器。 该规则不需要其他参数

所以在UploadedFiles.js中,我现在有了

 $.validator.unobtrusive.adapters.addBool("validpath", "required"); 

在我看来

 @section Scripts { @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/Scripts/UploadedFiles.js") } 

相信这足以挂钩所有内容,但我现在需要编写javascriptvalidation器。 它们存在于jQuery.validator对象中,可以使用$ .validator.addMethod添加。

这是我因为以下几个原因而陷入困境的地方:

1)这是关于事情的正确方法,如果我的validation服务器服务器那么这是一个ajax调用吗? 这将需要同步。

2)是否有一个jQuery元素我应该重用这个? 我曾经希望,我已经完成了工作服务器端,我可以启用一些魔术来连接客户端(很像标准validation)。

3)我希望这可以在各种自定义validation属性中重复使用。 我怎样才能使这个通用?

如果我是从鼹鼠山上建造一座山,我会道歉。 谢谢你的时间 :)

拉斯

MVC附带RemoteAttribute ,它在内部对控制器方法进行ajax调用,该方法返回一个Json值,指示validation是成功还是失败

 public JsonResult IsValid(string SourceDirectory) { if (someCondition) //test if the value of SourceDirectory is valid { return Json(true, JsonRequestBehavior.AllowGet); // indicates its valid } else { return Json(false, JsonRequestBehavior.AllowGet); // indicates its not valid // or return Json("A custom error message that overrides the default message defined in the attribute"); } } 

和装饰你的财产

 [Remote("IsValid", "YourController", ErrorMessage = "The path is not valid")] public string SourceDirectory { get; set; } 

注意: RemoteAttribute仅用于客户端(jquery unobtrusive validation),您可能仍需要额外的服务器端validation。

有关详细示例,请参阅如何:在ASP.NET MVC中实现远程validation