1

我正在使用Extended Validation属性来打开更严格的验证,具体取决于我编辑记录的方式。

EG:我有一个有子对象的父对象。

编辑子项时,ModelState.isValidfalse,由于缺少父项,例如名字,因为我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 具有所有必需的字段,否则它不会验证——这相当浪费。

4

1 回答 1

1

You could override ValidationAttribute.IsValid Method (Object, ValidationContext)

protected virtual ValidationResult IsValid(
    Object value,
    ValidationContext validationContext
)

And access members of ValidationContext Class

于 2012-06-14T07:16:31.753 回答