レコードの編集方法に応じて、属性を使用し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;}
....
}
私のフォームには親ID
(EFまたは休止状態のアプリで必要なものすべて)が含まれていますが、フォームに渡された親に必要なフィールドがすべて含まれていない限り、検証されません。これはかなり無駄です。