0

私のビジネス ドメインでは、"User" エンティティは単一の "Person" エンティティに関連付けられています (そのため、User インスタンスにはセキュリティ/ログイン情報が含まれていますが、Person エンティティには個人の人間の連絡先情報が含まれています)。

私の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
}

Web ページを使用すると、訪問者はユーザーを編集して、ユーザーの個人情報を新しい個人インスタンスまたはデータベースから取得した既存の個人に置き換えることができます。

フォームのスクリーンショットが添付されています。

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

「別の従業員」ラジオボタン (「UserViewModel.PersonViewModelIsNew」プロパティにマップ) が選択されている場合、「UserViewModel.Person」メンバーの検証が無効になるという考え方です。

ただし、ASP.NET MVC には WebForms のような検証グループの概念がないため、このように検証を制御するにはどうすればよいでしょうか?

4

2 に答える 2

1

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

ViewModel を [Bind(Exclude="Person")] でマークし、Action メソッドでこれを行うことが 1 つの解決策であることがわかりました。

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

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

// Update DB here

このアプローチは今のところうまくいくようです。

于 2012-04-22T22:12:33.143 に答える
0

MVC Foolproof Validation プロジェクトは、ASP.NET MVC に含まれるバリデーターではカバーされないいくつかの状況をカバーする優れた検証ルールをいくつか追加します。

もちろん、特別な要件がある場合は、カスタム検証ルールを記述できます。ValidationAttribute クラスを継承してカスタム検証属性を作成することにより、オプションでクライアントで検証を提供することもできます。

于 2012-04-22T21:43:09.737 に答える