将 Class 中的 属性 传递给 ValidationAttribute
Pass Property of Class to ValidationAttribute
我正在尝试编写自己的 ValidationAttribute
,为此我想将 class 的参数值传递给 ValidationAttribute
。很简单,如果布尔值 属性 是 true
,那么上面带有 ValidationAttribute
的 属性 不应该为 null 或空。
我的class:
public class Test
{
public bool Damage { get; set; }
[CheckForNullOrEmpty(Damage)]
public string DamageText { get; set; }
...
}
我的属性:
public class CheckForNullOrEmpty: ValidationAttribute
{
private readonly bool _damage;
public RequiredForWanrnleuchte(bool damage)
{
_damage = damage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string damageText = validationContext.ObjectType.GetProperty(validationContext.MemberName).GetValue(validationContext.ObjectInstance).ToString();
if (_damage == true && string.IsNullOrEmpty(damageText))
return new ValidationResult(ErrorMessage);
return ValidationResult.Success;
}
}
但是,我不能像那样简单地将 class 内的 属性 传递给 ValidationAttribute。传递 属性 的值的解决方案是什么?
不应将 bool
值传递给 CheckForNullOrEmptyAttribute
,而应传递相应 属性 的名称;在该属性中,您可以从正在验证的对象实例中检索此 bool
值。
下面的 CheckForNullOrEmptyAttribute
可以应用于您的模型,如下所示。
public class Test
{
public bool Damage { get; set; }
[CheckForNullOrEmpty(nameof(Damage))] // Pass the name of the property.
public string DamageText { get; set; }
}
public class CheckForNullOrEmptyAttribute : ValidationAttribute
{
public CheckForNullOrEmptyAttribute(string propertyName)
{
PropertyName = propertyName;
}
public string PropertyName { get; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var hasValue = !string.IsNullOrEmpty(value as string);
if (hasValue)
{
return ValidationResult.Success;
}
// Retrieve the boolean value.
var isRequired =
Convert.ToBoolean(
validationContext.ObjectInstance
.GetType()
.GetProperty(PropertyName)
.GetValue(validationContext.ObjectInstance)
);
if (isRequired)
{
return new ValidationResult(ErrorMessage);
}
return ValidationResult.Success;
}
}
我正在尝试编写自己的 ValidationAttribute
,为此我想将 class 的参数值传递给 ValidationAttribute
。很简单,如果布尔值 属性 是 true
,那么上面带有 ValidationAttribute
的 属性 不应该为 null 或空。
我的class:
public class Test
{
public bool Damage { get; set; }
[CheckForNullOrEmpty(Damage)]
public string DamageText { get; set; }
...
}
我的属性:
public class CheckForNullOrEmpty: ValidationAttribute
{
private readonly bool _damage;
public RequiredForWanrnleuchte(bool damage)
{
_damage = damage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
string damageText = validationContext.ObjectType.GetProperty(validationContext.MemberName).GetValue(validationContext.ObjectInstance).ToString();
if (_damage == true && string.IsNullOrEmpty(damageText))
return new ValidationResult(ErrorMessage);
return ValidationResult.Success;
}
}
但是,我不能像那样简单地将 class 内的 属性 传递给 ValidationAttribute。传递 属性 的值的解决方案是什么?
不应将 bool
值传递给 CheckForNullOrEmptyAttribute
,而应传递相应 属性 的名称;在该属性中,您可以从正在验证的对象实例中检索此 bool
值。
下面的 CheckForNullOrEmptyAttribute
可以应用于您的模型,如下所示。
public class Test
{
public bool Damage { get; set; }
[CheckForNullOrEmpty(nameof(Damage))] // Pass the name of the property.
public string DamageText { get; set; }
}
public class CheckForNullOrEmptyAttribute : ValidationAttribute
{
public CheckForNullOrEmptyAttribute(string propertyName)
{
PropertyName = propertyName;
}
public string PropertyName { get; }
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var hasValue = !string.IsNullOrEmpty(value as string);
if (hasValue)
{
return ValidationResult.Success;
}
// Retrieve the boolean value.
var isRequired =
Convert.ToBoolean(
validationContext.ObjectInstance
.GetType()
.GetProperty(PropertyName)
.GetValue(validationContext.ObjectInstance)
);
if (isRequired)
{
return new ValidationResult(ErrorMessage);
}
return ValidationResult.Success;
}
}