2012-04-19 8 views
0

子モデルを保存するときに、親モデル(VehicleManufacturer)の特定のプロパティで必須フィールドの検証をオフにしたいとします。 (VehicleModel)、すなわち:だからMVC .NET [必須]子モデルの無効なModelStateを引き起こす親モデルのDataAnnotations

public class VehicleManufacturer 
{ 
    public virtual Guid Id { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public virtual string Name { get; set; } 
} 

public class VehicleModel 
{ 
    public virtual Guid Id { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public virtual string Name { get; set; } 

    public virtual VehicleManufacturer Manufacturer { get; set; } 
} 

、私はManufacturerNameので、私は気にすべてが、それは、しかし、ドロップダウンリストから選択される名前とManufacturerID、だされ、新しいモデルを保存していたときにエンティティで[必須]とマークされている場合、ManufacturerNameがnullのため、新しいVehicleModelを保存するときにModelStateを無効にします。(

私はこれに対する最良のアプローチとそれを行う方法を知っています。 は、私はいくつかの解決策を考えることができますが、どれも正しい方法であると思わない:

  • にModelStateチェックする前に、「デフォルト」ManufacturerName値を設定し、すなわち 「 - 」だけDataAnnotation
  • 移入両方ManufacturerNameを満たすために私VehicleModelViewで とManufacturerId - よくないあなたの親 モデルはあなたが本当に
  • オフに
  • 子モデルで使用する必要はありません。必要なフィールドの束を持っている場合は、[必須]子モデル(わからない 方法の検証?)

あなたはどう思いますか?

+0

あなたのモデルはEntity Frameworkモデルだと思いますか?このため、エンティティモデルをビューのモデルとして使用しないでください。 ViewModelsはビューごとに固有のものでなければなりません。次に、画面ごとに異なる検証を行うことができます。 – Simon

答えて

1

に可能な解決策は、VehicleModelにVehicleManufacturer(VehicleManufacturerId)に外部キー列を追加し、ビューでその列を使用することです。私はParentWithExtendedValidationのようなものを持つ親モデルサブクラス化されてやってしまった何を

+0

これを受け入れることで、完全なメーカーではなくManufacturerIdプロパティを持つ新しいViewModelが完成しました。 – Tsar

2

最も簡単な方法は、表示したくないプロパティに非表示のフィールドを設定することです。

+0

こんにちは、このプロパティは、親モデル(VehicleManufacturer)を作成するときにのみ必要ですが、子モデル(VehicleModel)を作成するときは必要ではありません。私はModelStateを満たすためだけに必要なプロパティを設定したくないのですか?... – Tsar

0

IValidatableObjectのインターフェイスは、カスタムモデルの検証用です。例えば

public class VehicleModel : IValidatableObject 
{ 
    public virtual Guid Id { get; set; } 

    [StringLength(50, MinimumLength = 1)] 
    public virtual string Name { get; set; } 

    public virtual VehicleManufacturer Manufacturer { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if(string.IsNullOrWhiteSpace(Name)) 
     { 
      yield return new ValidationResult("Name is required") 
     } 
    } 
} 

は、その後、あなたのコントローラのコールModelState.IsValid

0

:親

ParentWithExtendedValidation様々な[必須]フィールドのすべてにおいては、タグ付けされました。

私は具体的に親を編集したいときは、ParentWithExtendedValidationタイプ を使用しました.Parentのサブクラスであるため、モデル検証にパスしたら、それをparentにキャストしてDALに渡します。

これを参照している子を編集するなどの関係でそれを使用している場合は、通常のParentクラスを使用できます。

希望これは、私はクラスPersonを持って

EGを支援 - 私の通常の仮想プロパティのすべてで、そして唯一のIDが(person-に選択検証> IDを作るために、まだ右働く)が必要です

クラスPersonEVモデルと引数の例PersonEVを使用してビュー/コントローラの仕事に続いて

public class PersonWithExtendedValidation : Person 
{ 

    [Required] 
    public override string FullName { get; set; } 
    [Required] 
    public override string FirstName { get; set; } 
    [Required] 
    public override string LastName { get; set; }   
    [Required] 
    public override string DomainName { get; set; } 
    [Required] 
    public override string WorkPhone { get; set; } 
    [Required] 
    public override string CellPhone { get; set; } 
    [Required] 
    public override string Email { get; set; }   
} 

あなたが戻って(人)にキャストModelState.IsValid、をチェックし、正常な

0

OKとどんなリポジトリかなどに渡したら。私はこれを見て、私の方法が無駄であることを認識しました。

これはどのように見えるのですか?

私は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))]のフィールドは、

これは、同様のバリデータの他のタイプのために働きます。

私は実際に先に行って、バリ「たまにON」のセットを作成し、別のクラスに自分の設定を移動: のpublic staticクラスExtendedValidation { プライベート静的辞書extendedValidationExemptions =新しい辞書();

/// <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をオフにしてください。

E.G:子を編集するときに、DisableExtendedValidation(typeof(Parent))を実行して途中で取得できません。

編集:うーん、私はこれはかなり動作しません。 - validationProperty内でどのクラスを見ているのか判断できますか?私はいつも親のプロパティを渡すことができたと思うが、それはピタです

関連する問題