我正在使用 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
但这些验证是在服务器端触发的,我们需要让它在客户端工作。
您应该创建自己的自定义 ValidationAttribute。如果您想要客户端验证,您的属性应该实现 IClientValidatable 接口,并且您应该编写自定义客户端验证器。
Updated:添加了代码示例
实施验证器:
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)