2011-10-03 6 views
8

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

ここで流れです。:

  1. 送信フォームを使用してください。
  2. コード(特殊アクションフィルタ)は、モデルをTempDataに追加し、ログオンページにリダイレクトします。
  3. ユーザーはTempDataをを読み込み、ステップ3の後、直接

POSTアクションを呼び出すアクションをGETするために戻ってリダイレクトされ、私は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 
} 

私はthis articleを見つけた状態:彼らは除去のためにタグ付けされている場合

  1. アイテムだけリクエストの終了時にTempDataをから削除されます。
  2. アイテムは、読み込み時にのみ削除のタグが付けられます。
  3. アイテムは、TempData.Keep(key)を呼び出してタグなしにすることができます。
  4. RedirectResultとRedirectToRouteResultは常にTempData.Keep()を呼び出します。

よく読んでくださいTempData["xxx"]ではありません "読んで"したがってそれらは削除のタグを付ける必要がありますか?

最後に、私はちょっと心配しています。POST(P-R-G)後にリダイレクトをしているからです。しかし、これは避けることはできません。

私は "このアイテムを捨てる"と言うことができる方法はありますか? TempData.Remove?または私はこれを間違っている?

+0

リダイレクトを完全に実行し、2番目の処理方法を返す必要はありません。そういうわけではないのです。 – Buildstarted

+0

@BuildStarted - POSTメソッド*は終了後にリダイレクトを行います。 POSTメソッドにリダイレクトすることはできません。GETではありませんか? – RPM1984

+0

私が限られたデータに基づいて読んでいるものは、ポストにコード*でリダイレクト*を行い、 'StatefulAuthorize'が呼び出されないということです。 – Buildstarted

答えて

9

私はそれを読んだ直後にTempData.Removeを追加して修正しました。

これは本当にうれしいです。私はTempDataの全体のポイントは私がでなかったことだと思ったこれを行う必要があります。

また、セッションを直接使用することもできます。

+0

それはそれをオフにする方法ではありません。あなたは、TempDataではなくSessionをかなり使用することができます。 TempDataの利点は、それが単独でデータを管理することです。 先ほど答えたように、値は、場合にのみ、アクションの結果、他のすべてのシナリオで(このするViewResult/ContentResult /化するJsonResultとして)200でクリアされ、(例えばRedirectActionなど)302のHTTPステータスコードを得正確任意のアクションを保持しますTempDataのデータ。 詳細については、以下をお読みください http://stackoverflow.com/questions/32571599/asp-net-tempdata-isnt-cleared-even-after-reading-it –

6

ここに関与2件のGET HTTPリクエストがあります。

は、最初の要求がクライアントによって送信され、最初の要求の終わりにTempDataを
  • に何かを格納一つです
    1. クライアントが送信するには、ログオンページを取得するための2番目のHTTP要求。

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

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

    TempDataを削除するには、ログオンページのレンダリング時にTempDataから読み取る必要があります。

  • +0

    お客様の権利。しかし、私はログオンページでそれについて気にしない。私はサインインするときに "自動投稿"をしようとしているので、フォームを再提出する必要はありません。そのため、私はPOSTアクションを直接呼び出す(なぜなら、それは別個のリクエストではないことを知っているからです)。だから私は本当にTempDataを使用するべきではないと思う。なぜなら、それは2つの要求のために、私は次のデータではなく、データを必要とするからだ。 – RPM1984

    3

    以下は、Tempデータを使用する際の注意点です。

    1)一時データへの読み取りアクセスでは、辞書からアイテムがすぐに削除されるのではなく、削除のマークのみが削除されます。

    2)常時データでは、アクセスされたアイテムは削除されません。アクションによってHttp 200ステータスコード(ViewResult/JsonResult/ContentResultなど)が発生した場合にのみアイテムが削除されます。

    3)Http 302(リダイレクトアクションなど)が発生するアクションの場合、データはアクセスされても記憶領域に保持されます。

    関連する問題