Asp.net MVC 3使用DataAnnotations进行条件验证

时间:2011-08-11 13:29:47

标签: asp.net asp.net-mvc asp.net-mvc-3

我正在使用Asp.net MVC 3,面临数据注释的验证问题,如下所示

我们在单独的库项目中维护模型,模型类层次结构如下

public class EditAlternateMailingAddressModel : BaseModel
{
    public UserAddressDetails AlternateAddressDetails { get; set; }

    public List<UsState> StateList { get; set; }        
}

现在userAddressDetails定义如下

 public partial class UserAddressDetails 
    {  
      public string DeliveryLine { get; set; }
      public string Zip { get; set; }
      public bool IsDefaultMailingAddress { get; set; }        
    }

验证逻辑在单独的类中定义,如下所示

[MetadataType(typeof(UserAddressDetailsMetaData))]
public partial class UserAddressDetails
{
    private class UserAddressDetailsMetaData
   {

      [Required(ErrorMessage = "Please enter address.")]
       public string DeliveryLine { get; set; }

       [Required(ErrorMessage = "Please enter city.")]
      public string City { get; set; }
        public bool IsDefaultMailingAddress { get; set; 
}

在编辑视图中, DeliveryLine,Zip依赖于IsDefaultMailingAddress,因为如果IsDefaultMailingAddress为true,则必须提供这些字段,否则请提交表单。

用于打开和部分提交我们使用jQuery的表单。

我们已在下面尝试过了 http://andrewtwest.com/2011/01/10/conditional-validation-with-data-annotations-in-asp-net-mvc/ http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx

但是这些验证是在服务器端激活的,我们需要让它在客户端工作。

1 个答案:

答案 0 :(得分:2)

您应该创建自己的自定义ValidationAttribute。如果您想要客户端验证,您的属性应该实现IClientValidatable接口,您应该编写自定义客户端验证器。

已更新:已添加代码示例

实施验证器:

public class CustomRequiredAttribute : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // your validation logic here
        return ValidationResult.Success;
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] {new CustomRequiredValidationRule (ErrorMessage)};
    }
}

public class CustomRequiredValidationRule : ModelClientValidationRule
{
    public RequiredIfVisibleValidationRule(string errorMessage)
    {
        ValidationType = "customRequire";
        ErrorMessage = errorMessage;
    }
}

添加客户端验证器:

(function ($) {
    $.validator.addMethod('customRequire', function (value, element) {
        // your validation logic here
        return true; // true if valid, otherwise false 
    });
    $.validator.unobtrusive.adapters.add('customRequire');
})(jQuery);
相关问题