0

ViewModelのアイデアはMVCにあると思いますが、更新と削除を行うと、コントローラに投稿するための別個のモデルがあるように思えます。私は、既定の剃刀コントローラがViewBagを使用して選択リストを保持していることに気付きました。投稿されたデータをMVCでどのようにモデル化する必要がありますか?

不要なデータが取り除かれているため、ViewModel(実際にはドメインエンティティ)はリターントリップで再利用できると思います。しかし、ViewBagに頼っているように見えるのは、ビューモデルにSelectlistなどを入れることができるため、ビューモデルを使用するときに意味をなさないと思われます。

私の質問は、異なる「投稿データ」モデルを作成するためにどのようなパターンがありますか? (この用語はEspositoのMVC 2の本から得ました)そして、投稿されたデータモデルはビューモデルにどのように関係すべきですか?たとえば、投稿モデルにビューモデルを含めるようにします。私はMVCに新しく、web-formsの背景から来ていません。私は本当にコントローラに送信されるデータをモデル化するための最良のパターンを理解したいと思います。

答えて

2

多くの場合、同じビューモデルを使用して編集/更新ビューに渡し、POSTアクションで受信します。限りドメインモデルとビューモデルの間のマッピングは、私はあなたにAutoMapperをお勧めします懸念しているよう

public ActionResult Edit(int id) 
{ 
    DomainModel model = ... fetch the domain model given the id 
    ViewModel vm = ... map the domain model to a view model 
    return View(vm); 
} 

[HttpPost] 
public ActionResult Edit(ViewModel vm) 
{ 
    if (!ModelState.IsValid) 
    { 
     // there were validation errors => redisplay the view 
     // if you are using dropdownlists because only the selected 
     // value is sent in the POST request you might need to 
     // repopulate the property of your view model which contains 
     // the select list items 
     return View(vm); 
    } 

    DomainModel model = ... map the view model back to a domain model 
    // TODO: process the domain model 

    return RedirectToAction("Success") 
} 

:ここでは一般的に使用されるパターンです。

+0

'ViewModel'を' DomainModel'にマッピングする必要があるのはなぜですか?なぜ 'ViewModel'の代わりに' DomainModel'を私たちのアクションに渡さないのでしょうか? –

+0

@Miroprocessor、ビューモデルを最初にこのビューに渡したためです。このビューには、このビューモデルの入力フィールドのみが含まれています。コントローラ・アクションは、ビュー・モデルのみをビューとの間で受け渡しする必要があります。あなたがコントローラのアクションを持っている場合、DomainModelを引数として取ると、このドメインモデルのほとんどのプロパティはPOSTされず、モデルバインダーはそれらを解決する方法を知らないため、nullになります。 –

+0

@ダリン、お返事ありがとうございます。あなたが示したパターンは、私が今までに聞いたパターンです。それでも、ビューモデルに含めることができるControllerModelを作成した場合、実際にコントローラを単純化するように思えます。それから、私はM、V、Cをモデルにしたでしょうか?これは悪い考えですか、それともあなたのようなことを試しましたか?再度、感謝します。 – Benjamin

関連する問題