web-dev-qa-db-ja.com

RedirectToActionのviewdataを保持します

[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の後にビューデータに「情報」テキストを保持しません。この問題を最もエレガントな方法で回避するにはどうすればよいですか?

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

ありがとう。

39
Thomas Stock

TempDataを使用できます。

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

TempData はまさにこの状況のた​​めに存在します。セッションをストレージとして使用しますが、2回目の応答後は存在しません。

MSDNから:

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

73
Mathias F

「this」リクエスト中にViewDataでデータにアクセスできるようにする必要がある場合は、Viewを使用します。データが「次の」リクエスト用である場合は、「TempData」を使用します(たとえば、 POST-REDIRECT-GETデザインパターン )。

13
eu-ge-ne

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

別の方法は、短いメッセージのみを転送する必要がある場合にCookieを使用することです。これには、Cookieの適切な暗号化が必要です。 TempDataプロパティに依存しないことで、MVC以外のコンテキスト、たとえば従来のASHXページでメッセージを設定することもできます。

FlashMessage を見てください。これにより、これを自分で実装する作業を節約できます。

2
Christ A

これが複数回必要な場合、優れた回避策は、一時データをビューデータにエクスポート/インポートするActionFilterAttributesを作成することです。その逆も同様です。この方法でModelStateを非常にうまく渡すこともできます(デモ ここ -#13)。そのコードにいくつかの調整を加えるだけで、クリーンなソリューションが得られると思います。

2
Leon

TempDataはストレージを使用しているように見え、「処理中」ではないITempDataProviderの形式では、オブジェクトがシリアル化可能である必要があるため、TempDataはWebファームの状況ではひどく不十分なようです...(ViewDataDictionary自体はシリアル化可能ではありません...)誰かがこれについて何か提案がありますか?

1
Novox