检索自定义条件ValidationAttribute中的条件值
本文关键字:条件 ValidationAttribute 自定义 检索 | 更新日期: 2023-09-27 18:12:05
我有一个自定义的MVC验证属性名为[DateOfBirth] -它在模型中使用如下:
[DateOfBirth("DOBMinimumAgeValidation", 18, 100, ErrorMessage = "Please enter a valid date of birth")]
public DateTime? DateBirth { get; set; }
public Boolean DOBMinimumAgeValidation { get; set; }
"18"为最小年龄,"100"为最大年龄。
这个想法是,我可以传递"DOBMinimumAgeValidation"属性作为一个参数,如果这个参数为真,它将覆盖"最小出生日期"检查。
所以,这是我的属性代码:public class DateOfBirthAttribute : ValidationAttribute, IClientValidatable
{
public DateOfBirthAttribute(string conditionalProperty, int minAge, int maxAge)
{
_other = conditionalProperty;
MinAge = minAge;
MaxAge = maxAge;
}
public int MinAge { get; private set; }
public int? MaxAge { get; private set; }
private string _other { get; set; }
[...]
这个想法是,我想在GetClientValidationRules方法中获得"_other"的值,这样我就可以覆盖它并将"MinAge"设置为0,如果值为真,像这样:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata,
ControllerContext context)
{
//yield return new ModelClientValidationRule
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "dateofbirth"
};
if(_other.GetTheValueSomehow() == true)
MinAge = 0;
rule.ValidationParameters.Add("minimumage", MinAge);
rule.ValidationParameters.Add("maximumage", MaxAge.GetValueOrDefault(999));
yield return rule;
}
但是,我不能传递"ValidationContext"对象给它,因为这只能从ValidationResult类型继承-所以我的问题是,我该如何获得"_other"的布尔值?
我不知道这是否有帮助,但在我查看了ModelMetadata metadata
和ControllerContext context
之后,我发现可以通过metaData.Container
访问将要验证的实际模型。其余部分是简单的c#语句和反射。获取模型,检查其是否具有名称为_other
的布尔属性,如果存在该属性,则检查其值是否为true:
var model = metadata.Container;
if (model != null)
{
var property = model.GetType().GetProperty(_other, typeof(bool));
if (property != null && (bool)property.GetValue(model))
{
MinAge = 0;
}
}