2012-04-22 15 views
0

私のビジネスドメインでは、 "User"エンティティは単一の "Person"エンティティに関連付けられています(Userインスタンスにはセキュリティ情報やログイン情報が含まれています。人の人の連絡先情報)。複雑なフォーム検証(子オブジェクトプロパティの検証を無効にする)

私のViewModelには次のようになります。

class UserViewModel { 
    [Required] 
    public String UserName { get; set; } 

    public Int64 PersonId { get; set; } 
    public PersonViewModel Person { get; set; } 

    public Boolean PersonViewModelIsNew { get; set; } 
} 

class PersonViewModel { 
    [Required] 
    public String FirstName; 
    [Required] 
    public String LastName; 
    // etc 
} 

ウェブページは、訪問者が、彼らはブランドの新しいPersonインスタンス、または既存の人のいずれかでユーザーの個人情報を交換することができるようなユーザーを編集することができますデータベースから取り出される。添付

フォームのスクリーンショットです:

Screenshot of the form

アイデアは(「UserViewModel.PersonViewModelIsNew」プロパティにマッピング)「別の従業員」ラジオ・ボタンは、その後の検証を選択した場合ということです「UserViewModel.Person」のメンバーは無効になります。

しかし、ASP.NET MVCにはWebFormsのような検証グループの概念がありません。このような検証をどのように制御できますか?

答えて

1

これは、検証の問題(バインディング後に検証が行われるため)よりもバインディングの問題が多いと思います。

私は一つの解決策は、[バインド(=「人」を除外)]とのViewModelをマークすることで発見され、これを行うには、私のアクションメソッドに:

if(model.PersonViewModelIsNew) { 
    TryUpdateModel(model.Person, "Person"); 
} 

if(!ModelState.IsValid) return View(model); 

// Update DB here 

このアプローチは今のために働くようです。

0

MVC Foolproof Validation projectには、必要なものと同様の[RequiredIfTrue Validation]属性のような、ASP.NET MVCに含まれているバリデータでカバーされていない状況が含まれています。

特別な要件がある場合はカスタム検証規則を書いている可能性があります。カスタム検証属性を作成するためにValidationAttributeクラスを継承することによって、クライアントに対して検証をオプションで提供することもできます。

関連する問題