我们遇到了类似的问题。我们有一个用于创建帐户的模型,该模型在其自定义属性上使用 IClientValidatable。但是,我们创建了一个批处理帐户创建过程,该过程位于我们无法引用 System.Web.Mvc 的网站之外。因此,当我们调用 Validator.TryValidateObject 时,任何从 IClientValidatable 继承的自定义验证器都只是简单的跳过。以下是我们正在处理的未能在我们的网站之外验证的内容:
public class AgeValidatorAttribute : ValidationAttribute, IClientValidatable
{
public int AgeMin { get; set; }
public int AgeMax { get; set; }
public override bool IsValid(object value)
{
//run validation
}
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = ErrorMessageString,
ValidationType = "agevalidator"
};
rule.ValidationParameters["agemin"] = AgeMin;
rule.ValidationParameters["agemax"] = AgeMax;
yield return rule;
}
删除 System.Web.Mvc 要求我们还删除 GetClientValidationRules 和 IClientValidatable 引用。为了做到这一点并且仍然有客户端验证,我们必须创建一个新类:
public class AgeValidatorClientValidator : DataAnnotationsModelValidator<AgeValidatorAttribute>
{
private readonly string _errorMessage;
private readonly string _validationType;
public AgeValidatorClientValidator(ModelMetadata metadata, ControllerContext context, AgeValidatorAttribute attribute)
: base(metadata, context, attribute)
{
this._errorMessage = attribute.FormatErrorMessage(metadata.DisplayName);
this._validationType = "agevalidator";
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRule
{
ErrorMessage = this._errorMessage,
ValidationType = this._validationType
};
rule.ValidationParameters["agemin"] = base.Attribute.AgeMin;
rule.ValidationParameters["agemax"] = base.Attribute.AgeMax;
yield return rule;
}
}
如您所见,它的作用与以前基本相同,只是使用 DataAnnatotationsModelValidator 而不是 IClientValidatable 完成。我们还需要执行一个步骤才能将 DataAnnotationsModelValidator 实际附加到属性,这是在 Global.asax.cs Application_Start 方法中完成的
DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(AgeValidatorAttribute), typeof(AgeValidatorClientValidator));
现在您可以像使用普通属性一样使用它:
[AgeValidator(AgeMax = 110, AgeMin = 18, ErrorMessage = "The member must be between 18 and 110 years old")]
public string DateOfBirth { get; set; }
我知道这个问题已经有一年了,但我昨天和今天花了一整天的时间试图解决这个问题。因此,如果 OP 还没有找到答案,我希望这可以帮助遇到同样问题的人。
请注意,我没有在这篇文章中包含任何 javascript,因为它不需要更改使用 jQuery.validate 的自定义验证规则的标准实现。