我正在尝试验证表单提交但我想仅在另一个属性设置为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设置的,我不想改变任何这个。如何在不使属性静态的情况下实现此目的?
答案 0 :(得分:2)
在编译时将属性添加到程序集的元数据中,因此必须在编译时知道其参数。生成错误是因为您将属性(bool IsFeaturette
)的值传递给非静态属性(在运行时可能是true
或false
)。
相反,传递一个字符串,指示要比较的属性的名称,并在方法中使用反射来获取属性的值。
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
),这是验证属性应该允许的。