检索自定义条件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"的布尔值?

检索自定义条件ValidationAttribute中的条件值

我不知道这是否有帮助,但在我查看了ModelMetadata metadataControllerContext 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;
    }                
}