ASP.NET-MVC3中“自我validation模型”中的客户端validation

这是这个问题的后续问题: DataAnnotations如何在MVC中真正起作用? 有一个示例自定义validation,并提到了“自我validation模型”。 这很有意思,但我不明白如何为它编写客户端validation。

我的模型对象可以实现IClientValidateble接口(或仅用于dataannotation属性吗?),我想看一个如何做的例子。

编辑:根据我的理解,“自我validation模型”在不使用DataAnnotations的情况下工作,并在类中声明了我正在validation的属性的validation逻辑,并且它(不一定)使用属性来validation某些东西。

我在自定义客户端validation中看到的所有示例都是关于实现IClientValidatable的dataannotation 属性

当我在我的类中声明我的validation逻辑时,我不使用属性来validation模型状态。

当我在实现IValidatebleObject接口的模型类的Validate方法中声明我的validation逻辑时,如何编写客户端validation?

我实际上传递给视图的类可以实现IClientValidatable接口或类似的东西吗?

采取相同的答案:

在实现自我validation模型之后,巫婆是服务器端validation,您需要创建客户端validation部分,为此,只需创建以下3个步骤:

  • 实行
  • 实现jQueryvalidation方法
  • 实现一个不显眼的适配器

附加到您的IClientValidateble

 public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelCLientValidationRule(); rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); rule.ValidationType = "greater"; // This is what the jQuery.Validation expects rule.ValidationParameters.Add("other", OtherPropertyName); // This is the 2nd parameter yield return rule; } 

然后你需要编写新的jQuery Validator元数据适配器 ,它将jQuery.Validation链接到你的代码,为该字段提供正确的data-属性(当然, UnobtrusiveJavaScriptEnabled为true)

创建一个新的js文件并附加到 ,例如as

  

并附加新的validation

 jQuery.validator.addMethod("greater", function(value, element, param) { // we need to take value and compare with the value in 2nd parameter that is hold in param return Date.parse(value) > Date.parse($(param).val()); }); 

然后我们编写适配器

 jQuery.validator.unobtrusive.adapters.add("greater", ["other"], function(options) { // pass the 'other' property value to the jQuery Validator options.rules["greater"] = "#" + options.param.other; // when this rule fails, show message that comes from ErrorMessage options.messages["greater"] = options.message; }); 

您可以在创建新的MVC3 Web Applicatoin时在AccountModel.cs查看此内容,它显示了实现IClientValidatable此方法

 [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public sealed class ValidatePasswordLengthAttribute : ValidationAttribute, IClientValidatable { private const string _defaultErrorMessage = "'{0}' must be at least {1} characters long."; private readonly int _minCharacters = Membership.Provider.MinRequiredPasswordLength; public ValidatePasswordLengthAttribute() : base(_defaultErrorMessage) { } public override string FormatErrorMessage(string name) { return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, _minCharacters); } public override bool IsValid(object value) { string valueAsString = value as string; return (valueAsString != null && valueAsString.Length >= _minCharacters); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { return new[]{ new ModelClientValidationStringLengthRule(FormatErrorMessage(metadata.GetDisplayName()), _minCharacters, int.MaxValue) }; } } #endregion