行。我看了看这个,意识到我的方法很浪费。
这看起来怎么样?
我创建了一个名为 ExtendedValidationRequired 的注释。
它有一个静态值,可以打开或不打开扩展值的条件检查。
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class ExtendedValidationRequiredAttribute : RequiredAttribute
{
// Summary:
// Initializes a new instance of the System.ComponentModel.DataAnnotations.RequiredAttribute
// class.
public ExtendedValidationRequiredAttribute()
{
}
// Summary:
// Checks that the value of the required data field is not empty.
//
// Parameters:
// value:
// The data field value to validate.
//
// Returns:
// true if validation is successful; otherwise, false.
//
// Exceptions:
// System.ComponentModel.DataAnnotations.ValidationException:
// The data field value was null.
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (ExtendedValidation.IsExtendedValidationEnabled(validationContext.ObjectType))
{
return base.IsValid(value,validationContext);
}
else
{
return ValidationResult.Success;
}
}
}
然后我用 [ExtendedValidationRequired(typeof(MyClassName))] 标记我的有时需要(例如,当我直接编辑该类时)字段
这也适用于其他类型的验证器。
实际上,我继续创建了一组“有时开启”验证器并将我的设置移动到一个单独的类: public static class ExtendedValidation { private static Dictionary extendedValidationExemptions = new Dictionary();
/// <summary>
/// Disable extended validation for a specific type
/// </summary>
/// <param name="type"></param>
public static void DisableExtendedValidation(Type type)
{
extendedValidationExemptions[type] = true;
}
/// <summary>
/// Clear any EV exemptions
/// </summary>
public static void Reset()
{
extendedValidationExemptions.Clear();
}
/// <summary>
/// Check if a class should perform extended validation
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static bool IsExtendedValidationEnabled(Type type)
{
if (extendedValidationExemptions.ContainsKey(type))
{
return false;
}
else
{
return true;
}
}
}
}
现在我只是在编辑子项时关闭 ExtendedValidation。
EG:编辑 Child 时,可以 DisableExtendedValidation(typeof(Parent)) 而不会妨碍。
编辑: Hrm,我意识到这不太管用。-- 我可以确定我在validationProperty 中查看的类吗?我想我总是可以传递父属性,但那是一个 PITA