如果其他属性设置为true,如何使用mvc dataannotations验证属性值?

时间:2016-05-24 22:27:31

标签: c# asp.net-mvc-5 data-annotations

我正在尝试验证表单提交但我想仅在另一个属性设置为true时验证属性。

我的两个属性:

[DisplayName(Translations.Education.IsFeaturette)]
public  bool IsFeaturette { get; set; }

[DisplayName(Translations.Education.AddFeaturetteFor)]
[CusomValidatorForFeaturettes(IsFeaturette)]
public string[] Featurettes { get; set; }

自定义注释:

public class CusomValidatorForFeaturettes: ValidationAttribute
{
    private readonly bool _IsFeatturette;
    public CusomValidatorForFeaturettes(bool isFeatturette): base("NOT OK")
    {
        _IsFeatturette = isFeatturette;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null && _IsFeatturette )
        {
            var errorMessage = FormatErrorMessage(validationContext.DisplayName);
            return new ValidationResult(errorMessage);

        }
        return ValidationResult.Success;
    }
}

如果isfeature为true,那么Basictly则Featurettes必须有一个值!

获取错误:

  

非静态字段,方法或者需要对象引用   物业'EducationViewModel.IsFeaturette'

我不能使这个属性静态cuz会给我带来问题,因为这个属性是用enityframework设置的,我不想改变任何这个。如何在不使属性静态的情况下实现此目的?

1 个答案:

答案 0 :(得分:2)

在编译时将属性添加到程序集的元数据中,因此必须在编译时知道其参数。生成错误是因为您将属性(bool IsFeaturette)的值传递给非静态属性(在运行时可能是truefalse)。

相反,传递一个字符串,指示要比较的属性的名称,并在方法中使用反射来获取属性的值。

public  bool IsFeaturette { get; set; }

[CusomValidatorForFeaturettes("IsFeaturette")]
public string[] Featurettes { get; set; }

并将验证属性修改为

public class CusomValidatorForFeaturettes: ValidationAttribute
{
    private readonly string _OtherProperty;

    public CusomValidatorForFeaturettes(string otherProperty): base("NOT OK")
    {
        _OtherProperty = otherProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // Get the dependent property 
        var otherProperty = validationContext.ObjectInstance.GetType().GetProperty(_OtherProperty);
        // Get the value of the dependent property 
        var otherPropertyValue = otherProperty.GetValue(validationContext.ObjectInstance, null);
        ......

然后,您可以将otherPropertyValue转换为bool并进行有条件检查。

我还建议您阅读The Complete Guide to Validation in ASP.NET-MVC-3 Part-2以更好地了解如何实现验证属性,包括如何实现IClientValidatable,以便同时获得服务器和客户端验证。我还建议您将方法重命名为(例如)RequiredIfTrueAttribute以更好地反映它正在做什么。

另请注意,foolproof具有适用于MVC的各种验证属性。

作为最后一点,你当前的实现特定于对一个属性的依赖(IsFeaturette的值),这对于验证属性来说是没有意义的 - 你最好只检查一下控制器并添加ModelStateError。上面的代码意味着你可以传入任何属性名称(只要该属性是typeof bool),这是验证属性应该允许的。