1
public ActionResult Index()
{
    TempData["msg"] = "Test";
    return RedirectToAction("About");
}

public ActionResult About()
{
    var msg = TempData["msg"];
    return View();
}

簡単な質問。答えが出たら額を叩くと思います。

ブラウザで[インデックス]アクションに移動すると、[バージョン情報]アクションにリダイレクトされ、TempData値が正しくなります。

Fiddlerコンポーザーを使用してIndexアクションに移動すると、Aboutアクションにリダイレクトされるのに、TempData値が失われてnullになるのはなぜですか?

4

2 に答える 2

1

答えはここにあると思います(http://msdn.microsoft.com/en-us/library/ms178581(v=vs.100).aspx):

「セッションは、SessionIDプロパティを使用して読み取ることができる一意の識別子によって識別されます。ASP.NETアプリケーションでセッション状態が有効になっている場合、アプリケーション内のページに対する各要求は、ブラウザーから送信されたSessionID値について検査されます。 SessionID値が指定されていない場合、ASP.NETは新しいセッションを開始し、そのセッションのSessionID値が応答とともにブラウザーに送信されます。」

この行を各アクションの先頭に追加すると、次のようになります。

Debug.Write(string.Format("SessionId: {0}\r\n", HttpContext.Session.SessionID));

ブラウザから実行した場合、セッションIDは同じであることがわかります。フィドラー作曲家から実行されるとき、それらは異なります。

したがって、TempDataは、デフォルトのTempDataProvider(TempDataをセッション状態で格納する)を使用してリセットされます。

于 2012-09-27T03:02:03.877 に答える
0

リクエストが同じである場合、結果は同じである必要があります。偽のリクエストを作成するときに、最初のリクエストの正確なコピーを作成していない可能性があります。tempDataの場合、作成されたリクエストは、このデータを含む最初のリクエストである場合にのみ機能する(tempDataを取得する)ことに注意してください。したがって、アプリケーションによってまだ送信されていないリクエストの「コピー」を作成する必要があり、再生することはできません。 tempDataに依存します。

一時データはセッション状態で保存され、最初のリクエスト後に消去されるため、情報を正しく送信していない場合、またはFiddlerコンポーザーを介して(あなたの場合のように)2番目のリクエストを行った場合、無効/欠落します。同じコントローラーに同じ情報。

同じトピックに関する他の関連する質問も参照してください。

于 2012-09-26T20:24:47.140 に答える