2011-02-09 12 views
7

私はこのMVC 3 Razorアプリケーションで作業しており、通常は自分のビューのビューモデルを利用しています。MVCコントローラのアクション - 重複コードを使用してPOSTとGETを処理する

私のビューモデルのかなりの数は、自分のフォームでやりとりする特定のエンティティだけでなく、より多くの情報を含んでいます。私のGETアクションハンドラは、ビューモデルを初期化し、各プロパティに目的の値などを提供します。

私のPOSTアクションハンドラでは、モデルの状態が有効かどうかをチェックします。エラー。

私のPOSTアクションハンドラでは、自分自身のGETアクションハンドラからコードをコピーしてビューを再度レンダリングする必要があります。ビューモデルのデータを収集するコードをコピーする必要がないように、コントローラアクションを実装するにはどうすればよいですか?

POSTとGETの両方を処理するアクションハンドラを許可しようとしましたが、処理する入力パラメータがあります。私のPOSTアクションハンドラは、入力パラメータとしてビューモデルを持ちますが、GETアクションハンドラは表示されません。

+1

あなたは現在書いているコードのいくつかの例を挙げることができますか? – marcind

+1

あなたはアクションを得るためにポストアクションをリダイレクトしようとしましたか? – frennky

答えて

4

このような状況では、ビューモデル用のビルダーを作成します。

this postの下のオプション3を見てください。

+0

+1これはすてきで清潔なアプローチです。 –

+0

参照コードは私の元の質問に基づいて期待していたように、getアクションとpostアクションの両方でbuilderを使用しませんが、viewmodel用のBuilderを作成するのが良い解決策です。 – JBeckton

-1

あなたのPOSTアクションメソッドは、すべての個々のデータではなく、パラメータとしてviewmodel型にすることができます。ビューモデルが構築するのがより複雑な場合は、より複雑な作業を行うことができるビューモデルのモデルバインダーを作成することができます(アクションメソッドはVMタイプをパラメータとして使用します)。次のように

[HttpPost] 
public ViewResult MyAction(MyViewModel model) { 
    // model should now be fully populated; check ModelState.IsValid though in case there are errors (such as the user entering "abc" for an int property) 
} 
7

あなたのPOSTハンドラは、GETハンドラからのActionResultを返すことができます。

public ActionResult SomePageGet() { 
    var model = new SomePageViewModel(); 

    // Populate ViewModel: 
    ... 

    return View("SomePageGet", model); 
} 

[HttpPost] 
public ActionResult SomePagePost(SomePageViewModel input) { 

    // Validate the model: 
    ... 

    if (!ModelState.IsValid) { 
     // Return the GET page, with error messages: 
     return SomePageGet(); 
    } 

    return View("Success"); 
} 

にModelStateは、すべてのエラーメッセージ(無効な入力)を保持しているので、GETページは、通常、それらを表示します。

0

あなたは、作業しているメインエンティティの拡張メソッドに共通コードを単純にリファクタリングすることができます。

それから、DRYの間に何度でも電話してください。

私はその共通コードの機能は正確にはわかりませんが、主にリッチなプレゼンテーションのための関連データになります。 その場合、私が好むソリューションは、RenderActionを使用して別のアクションから余分なデータをロードすることです。後でAJAXページの更新にリファクタリングして、DRYのままにして、アクションの懸念を分離できます。

0

「...私は自分自身のコードをコピーすることを見つける...」

私はなぜ理解していません。なぜコントローラにメンバーを作成して呼び出すことができないのですか?あなたのコントローラーのすべてがアクションでなければならないわけではありません。しかし、@ataddeiniが提案したように、代わりにビルダーを見たいかもしれません。

関連する問題