9

ユーザーがログインしていないシナリオで、TempDataを使用してモデルオブジェクトを保存するASP.NET MVC 3 Webアプリケーションに取り組んでいます。

フローは次のとおりです。

  1. 送信フォームを使用します。
  2. コード (特別なアクション フィルター) はモデルを TempData に追加し、ログオン ページにリダイレクトします。
  3. ユーザーは、TempData を読み取り、POST アクションを直接呼び出す GET アクションにリダイレクトされました

ステップ 3 の後、TempData がクリアされると思いましたか?

コードは次のとおりです。

[HttpGet]
public ActionResult Foo()
{
    var prefilled = TempData["xxxx"] as MyModel;
    if (prefilled != null)
    {
       return Foo(prefilled);
    }
}

[HttpPost]
[StatefulAuthorize] // handles the tempdata storage and redirect to logon page
public ActionResult Foo(MyModel model)
{
   // saves to db.. etc
}

次のような記事を見つけました。

  1. アイテムは、削除のタグが付けられている場合にのみ、リクエストの最後に TempData から削除されます。
  2. アイテムは、読み取られたときにのみ削除用にタグ付けされます。
  3. 項目は、TempData.Keep(key) を呼び出すことでタグ付けを解除できます。
  4. RedirectResult と RedirectToRouteResult は常に TempData.Keep() を呼び出します。

それを読んでそれTempData["xxx"]は「読んだ」のではないので、削除のためにタグ付けする必要がありますか?

そして最後の1つは私に少し関係があります-私はPOST(PRG)の後にリダイレクトを行っているからです。しかし、これは避けられません。

「このアイテムを捨てる」と言える方法はありますか?TempData.Remove ? それとも私はこれを間違っていますか?

4

4 に答える 4

12

TempData.Remove読んだ直後に追加して修正しました。

これについてはあまり嬉しくありません。要点は、TempDataこれを行う必要がないということだと思いました。

Session を直接使用することもできます。

于 2011-10-03T03:05:17.330 に答える
7

ここには2つのGETHTTPリクエストが含まれています。

  1. 最初のリクエストはクライアントによって送信され、TempDataに何かを保存するリクエストです。
  2. 最初のリクエストの最後に、クライアントはログオンページをフェッチするために2番目のHTTPリクエストを送信します。

シナリオに関係するPOSTリクエストはありません。GET FooアクションからPOSTFooアクションを呼び出しているという事実は、別のリクエストが実行されていることを意味するわけではありません(まだ最初のGETリクエストのコンテキストにいます)。これはC#メソッド呼び出しであり、個別のリクエストではありません。

最初のリクエストでTempDataに何かを保存すると、このTempDataは2番目のリクエストで使用できるようになります。したがって、ログオンページをレンダリングするコントローラーアクションで使用できるようになります。

したがって、TempDataを削除する場合は、ログオンページをレンダリングするアクションでTempDataから読み取る必要があります。

于 2011-10-03T06:02:44.723 に答える
0

それはそれをクリアする方法ではありません。TempData の代わりに Session を使用することもできます。TempData の唯一の利点は、データを単独で管理することです。

以前に回答したように、他のすべてのシナリオで Action の結果が 200 (ViewResult/ContentResult/JsonResult など) になった場合にのみ Value がクリアされます。正確に 302 の Http Status コードを生成するアクション ( RedirectAction など) はデータを保持します。温度データ。

詳細については、以下をお読みください

ASP.NET TempData を読み取った後でもクリアされない

于 2015-09-14T18:40:56.057 に答える