2011-03-01 87 views
3

这是此问题的后续问题:How does DataAnnotations really work in MVC? 有一个示例自定义验证,并提到了“自我验证模型”。这很有趣,但我不明白如何为它编写客户端验证。ASP.NET-MVC3中的“自我验证模型”中的客户端验证

我的模型对象是否可以实现IClientValidateble接口(或仅用于dataannotation属性?),我希望看到有关如何实现它的示例。

编辑:就我的理解,“自我验证模型”在不使用DataAnnotations的情况下工作,并在我正在验证的属性中声明验证逻辑,而且它不是(必然)使用属性来验证某些内容。

我在自定义客户端验证中看到的所有示例都是关于实现IClientValidatable的数据注解属性

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

当我在实现IValidatebleObject接口的模型类的Validate方法中声明我的验证逻辑时,如何编写clientside验证?

我真的传递给视图的类是否可以实现IClientValidatable接口或类似的东西?

回答

2

采取了相同的答案:

后你实现自我验证模型,女巫是一个服务器端验证,你需要创建客户端验证部分,对于这一点,只需创建此3个步骤:

  • 实施
  • 实现一个jQuery验证方法
  • 实现一个不显眼的适配器

追加到IClientValidateble

public IEnumerable<ModelClientValidation> 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的验证元数据适配器将链接jQuery的。验证你的代码提供正确的data-属性该字段(如果当然,UnobtrusiveJavaScriptEnabled为true)

创建一个新的js文件,并连接到您的<head>例如,作为

<script src="@Url.Content("~/Scripts/customValidation.js")" type="text/javascript"></script> 

并追加新验证

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; 
}); 

当你创建一个新的Web MVC3您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<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     return new[]{ 
      new ModelClientValidationStringLengthRule(FormatErrorMessage(metadata.GetDisplayName()), _minCharacters, int.MaxValue) 
     }; 
    } 
} 
#endregion 
+0

我更新的问题更加清晰。 – SoonDead 2011-03-01 15:06:50

+1

这显然不像以前那样是一回事,因为在这里他会询问是否可以在每个属性上使用IClientValidatable WITHOUT(dataannotain)属性!你的答案包含'public sealed class ValidatePasswordLengthAttribute:ValidationAttribute,IClientValidatable',所以这显然不是一个正确的答案! – TDaver 2011-03-04 12:56:13