好的,所以我找到了一种方法来获得我想要的结果,尽管它比我想要/想象的要多一点工作。我缺少的东西是我没有在我的自定义验证类中实现 IClientValidatable 并且必须将我的自定义验证添加到我尝试过的 jQuery Validator addmethod 但没有在自定义验证类中使用 IClientValidatable ,我将快速运行假设你已经设置/包含了所有 jQuery 东西,如何让这个工作即时通讯
首先创建使用自定义验证属性的简单模型
public class Person
{
[Required]
[Display( Name="Name")]
public string Name { get; set; }
public int Age { get; set; }
//Uses a custom data annotation that requires that at lease it self or the property name passed in the constructor are not empty
[OneOfTwoRequired("Mobile")]
public string Phone { get; set; }
[OneOfTwoRequired("Phone")]
public string Mobile { get; set; }
}
自定义验证类,使用反射获取传入的字符串名称的属性进行测试
注意截至 2012 年 8 月 15 日:如果您使用的是 MVC 4,则需要引用 System.web.mvc 3.0 才能使用 IClientValidatable,因为 MVC 4 中似乎不存在 ModelClientValidationRule
public class OneOfTwoRequired : ValidationAttribute, IClientValidatable
{
private const string defaultErrorMessage = "{0} or {1} is required.";
private string otherProperty;
public OneOfTwoRequired(string otherProperty)
: base(defaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
}
this.otherProperty = otherProperty;
}
public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, otherProperty);
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
PropertyInfo otherPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(otherProperty);
if (otherPropertyInfo == null)
{
return new ValidationResult(string.Format("Property '{0}' is undefined.", otherProperty));
}
var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
if (otherPropertyValue == null && value == null)
{
return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
//This is the name of the method aaded to the jQuery validator method (must be lower case)
ValidationType = "oneoftworequired"
};
}
}
将此添加到视图或部分视图中,您必须确保它不在 $(document).ready 方法中
jQuery.validator.addMethod("oneoftworequired", function (value, element, param) {
if ($('#Phone).val() == '' && $('#Mobile).val() == '')
return false;
else
return true;
});
jQuery.validator.unobtrusive.adapters.addBool("oneoftworequired");
如果您想验证表单而不回发或在初始页面加载时才需要 jQuery 验证器的东西,并且您只需调用 $('form').valid()
希望这可以帮助某人:)