我正在使用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
但是这些验证是在服务器端激活的,我们需要让它在客户端工作。
答案 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);