2011-02-04 7 views
1

私のモデルには2つのオブジェクト(リマインダーとユーザー)が含まれています。各アラームは1人のユーザーに関連付けられています。私は私が私のビューにデータを渡すために使うのviewmodelを定義したネストされたモデルによるViewModel検証

public class Reminder 
    { 
    [DisplayName("Subject")] 
    [Required(ErrorMessage = "{0}: error message.")] 
    [StringLength(200, ErrorMessage = "{0}: error message.")] 
    public string Name { get; set; } 

    [DisplayName("Supervisor")] 
    public User DepartmentSupervisor { get; set; } 
    } 

public class User 
    { 
    [DisplayName("Username")] 
    [Required(ErrorMessage = "{0}: error message.")] 
    [StringLength(25, ErrorMessage = "{0}: lerror message.")] 
    public string Username { get; set; } 

    [DisplayName("Email")] 
    [StringLength(50, ErrorMessage = "{0}: error message.")] 
    [Email(ErrorMessage="Not valid.")] 
    public string Email { get; set; } 
    } 

public class RemindersViewModel 
    { 
     public RemindersViewModel() 
     { 
      this.Supervisors = new List<SelectListItem>(); 
     } 
     public Models.Reminder Reminder { get; set; } 
     public List<SelectListItem> Supervisors { get; set; } 
    } 

監督は、私はコンボをレンダリングするために使用するユーザー(SelectListItem)の一覧です。

public ActionResult Edit(Guid id, Models.Reminder Reminder) 
{ 
    if (!ModelState.IsValid) 
    { 
    // PROBLEM. 
    } 
} 

すべてが正常に動作し、私がメールを表示する必要はありませんので、私は私のリマインダーは、選びだしのユーザー(ユーザー名)が、関連付けられている:私はフォームを送信すると
は、コントローラは、オブジェクトのリマインダーを再バインドドロップダウン、バインディングはフィールドを埋めることができないので、私のフォームに存在しません。 検証プロセスで、私が実際に望んでいないUserモデルを検証しようとするとエラーが発生します。 ネストされたモデルを扱う最善の方法は何ですか?

答えて

1

ビューモデルの使用を検討しましたか?ビューに必要なプロパティと、このビューの検証だけが含まれます。したがって、ビューに電子メールを必要としない場合は、電子メールなしでビューモデルを作成し、検証には大きな効果があります。その後、コントローラのアクション内で、このビューモデルを対応するドメインモデルにマップします。 AutoMapperはこの仕事のためのすばらしいツールです。

+0

あなたのお返事ありがとうございます。あなたが理解できる限り、私のビューモデルを「平坦化」することを提案しますか?私のクラスの再作成者は、タイプUserではないDepartmentSupervisorプロパティを持っています...そうですか?例はありますか? – LeftyX

+0

@vandalo、必ずしもフラットにする必要はありません。したがって、この特定のビューで作業するプロパティだけを含む 'ReminderViewModel'と' UserViewModel'をそれぞれ持つことができます。 ReminderViewModelには、UserViewModel型のプロパティがあります。 –

+1

私は理解し始めています。自分のドメイン(エンティティ)クラスを持っていると思います。次に、バリデーションルールを使っていくつかの中間クラス(リマインダ、ユーザなど)を作成し、これらのクラスをViewModelにネストします。私が理解できるものとして、中間クラスを取り除き、エンティティ(ドメイン)とビューモデルを持つだけです。そうですか? – LeftyX

関連する問題