2009-08-04 16 views
30
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult CreateUser([Bind(Exclude = "Id")] User user) 
{ 
     ... 
     db.SubmitChanges(); 
     ViewData["info"] = "The account has been created."; 
     return RedirectToAction("Index", "Admin"); 
} 

これは、redirectToActionの後にビュー情報の "情報"テキストを保持しません。 この問題を最も洗練された方法でどのように回避できますか?redirectToActionのビューデータを保持する

私の現在のアイデアは、[NonAction]のIndexコントローラアクションのものを入れて、IndexアクションとCreateUserアクションの両方からそのメソッドを呼び出すことですが、より良い方法が必要であると感じています。

ありがとうございました。

答えて

57

TempDataを使用できます。

TempData["info"] = "The account has been created."

TempDataがこの状況に正確に存在します。セッションとしてストレージを使用しますが、2回目のレスポンス後にはセッションが終了しません。 MSDNから

:TempDataDictionaryオブジェクトの

典型的な使用は、それが別のアクションメソッドにリダイレクトするときにアクションメソッドからのデータを通過させることです。たとえば、アクションメソッドは、RedirectToActionメソッドを呼び出す前に、コントローラのTempDataプロパティ(TempDataDictionaryオブジェクトを返す)にエラーに関する情報を格納することがあります。次のアクションメソッドはエラーを処理し、エラーメッセージを表示するビューをレンダリングします。

+0

興味深いことに、聞いたことがありません。 :-) –

+2

ビューで「TempData」を使用する必要があり、そこにViewDataをそのまま使用することはできません。 しかし、うまく動作するので、ありがとう。 –

+0

コピー拡張メソッドhttp://blog.eworlduiを参照してください。net/post/2008/06/MVC-Post-Redirect-Get-Sample-Updated.aspx –

10

ViewData「この」要求の間にデータがViewにアクセス可能な場合は、を使用してください。あなたのデータが「次の」リクエスト(例えば、POST-REDIRECT-GET design pattern)の場合は、「TempData」を使います。

+3

+1のPRGパターン –

2

これを複数回使用する必要がある場合は、tempdataをビューデータにエクスポート/インポートするActionFilterAttributesを作成してください(逆も同様です)。このようにModelStateを非常にうまく通すことができます(here - #13)。 そのコードを少し修正すれば、きれいな解決策が得られるはずです。

0

TempDataはストレージを使用しているように見えるため、ITempDataProviderのどのフォームでも「インプロセス」ではないため、オブジェクトがシリアル化可能である必要があるため、TempDataはWebファームの状況で悲観的に不適切です...(ViewDataDictionary自体はシリアル化可能ではありません...)誰にもこれに関する提案はありますか?

2

コントローラーのプロパティーはTempDataですが、バックグラウンドでセッション記憶域を使用するという欠点があります。つまり、Webファーム上で機能させるために余分な作業が必要になり、最初にアプリケーションでセッションを有効にする必要があります。

代わりに、ショートメッセージを転送する必要がある場合のみ、クッキーを使用することもできます。これには、クッキーの適切な暗号化が必要です。 TempDataプロパティに依存しないことで、非古典的なASHXページなどの非MVCコンテキストでメッセージを設定することもできます。

FlashMessageをご覧ください。これにより、これを自分で実装する作業を省くことができます。

関連する問題