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;}

   ....
}

私のフォームには親ID(EFまたは休止状態のアプリで必要なものすべて)が含まれていますが、フォームに渡された親に必要なフィールドがすべて含まれていない限り、検証されません。これはかなり無駄です。

4

1 に答える 1

1

ValidationAttribute.IsValidメソッド(オブジェクト、ValidationContext)をオーバーライドできます

protected virtual ValidationResult IsValid(
    Object value,
    ValidationContext validationContext
)

そして、ValidationContextクラスのメンバーにアクセスします

于 2012-06-14T07:16:31.753 に答える