我正在使用Extended Validation
属性来打开更严格的验证,具体取决于我编辑记录的方式。
EG:我有一个有子对象的父对象。
编辑子项时,ModelState.isValid
是false
,由于缺少父项,例如名字,因为我ID
仅选择其父项。
当我编辑父级时——我希望这些字段是必需的,但在编辑例如子级时不需要,相关联的父级是组成子级的一部分。
我有以下代码:
public class Parent
{
[Required]
public virtual int Id { get; set; }
[ExtendedValidationRequired(typeof(Parent))]
public virtual string Name { get; set; }
....}
以及以下用于验证:
public static class ExtendedValidation
{
private static Dictionary<Type, bool> extendedValidationExemptions = new Dictionary<Type, bool>();
/// <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;
}
}
}
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class ExtendedValidationRequiredAttribute : RequiredAttribute
{
private Type _type;
// Summary:
// Initializes a new instance of the System.ComponentModel.DataAnnotations.RequiredAttribute
// class.
public ExtendedValidationRequiredAttribute(Type type)
{
_type = type;
}
// 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.
public override bool IsValid(object value)
{
if (ExtendedValidation.IsExtendedValidationEnabled(_type))
{
return base.IsValid(value);
}
else
{
return true;
}
}
}
有什么办法可以绕过将类型显式传递给验证器?我希望能够以编程方式启用/禁用这些验证属性。
例如,如果我正在编辑一个子项,但父项的[Required]
字段会导致我遇到问题,我将typeof(Parent)
在 中禁用extendedValidator
,然后验证应该可以正常工作。我只是担心所有typeof()
事情都会影响性能。
我试图解决的问题是当我编辑一个类时
public class Child
{
[Required]
public virtual int id {get;set;}
[Required]
public virtual Parent parent {get;set;}
....
}
我的表单只有 Parent ID
(这就是我的 EF 或 hibernate 应用程序所需的全部内容),但除非表单中传递的 Parent 具有所有必需的字段,否则它不会验证——这相当浪费。