10

TempDataオブジェクトが別のコントローラーに値を渡さないという興味深い問題があります。

のメソッドをモデルに設定TempData["Enroll"]しました。次に、のメソッドでオブジェクトを読み取りますが、は/です。Enroll ControllerHttpPostEnrollTempData["Enroll"]Register ControllerHttpGetemptynull

このすべてのデータを3つのコントローラー間で永続化する必要があります。

何かご意見は?

これがコードスニペットです

//EnrollController.cs
[HttpPost]
public ActionResult Index(EnrollModel model)
{
   // ...
   TempData["EnrollModel"] = model;
   return RedirectToAction("Index", "Register");
}

// RegisterController.cs
public ActionResult Index(string type)
{
    RegisterModel model = new RegisterModel();

    EnrollModel enrollModel = TempData["EnrollModel"] as EnrollModel;
    model.ClientType = enrollModel.ClientType;
    // ...
}
4

4 に答える 4

4

ローカルマシンでのリダイレクト中にTempDataが失われるという問題がありました。

InProcであるweb.configsessionState設定を確認したので、問題ありません。

web.configで、本番システムから取得した別の設定を取得したことが判明しました。それはこのように見えました:

<httpCookies requireSSL="true" />

requireSSLをfalseに変更した後、TempDataは正常に機能します。

于 2015-10-01T13:49:55.027 に答える
2

今日も同じ問題がありました。

このリンクでは、メソッドがHTTP 302ステータスをブラウザに返すため、ブラウザが新しいリクエストを作成して一時をクリアすることを説明している人もいRedirectActionますが、HTTPメソッド303(RedirectAction返されるはずのもの)と307も返してみました、そしてそれは何も解決しませんでした。

私の場合の問題を修正する唯一の方法は、デフォルトの代わりに使用するようにweb.configのディレクティブTempDataを変更することでした。すなわち:sessionStateStateServerInProc

<system.web>
    <sessionState mode="StateServer" cookieless="AutoDetect" timeout="30" stateConnectionString="tcpip=localhost:42424"></sessionState>
    ...
</system.web>

このGregShacklesの記事を読んだときに、これを理解しました。彼は、デフォルトのようなセッションではなく、MongoDBデータベースに依存TempDataするカスタムの動作と構築方法を説明しています。TempDataProvider

私の4時間の調査が、誰かが時間を無駄にしないようにするのに役立つことを願っています。

于 2015-08-27T21:20:52.660 に答える
1

私は以前、TempDataでこの種の制限に遭遇しました。私はそれが実現不可能で散発的であることに気づきました。

あなたはあなたが達成しようとしていることを考慮する必要があります。データを保存する必要がある場合、実際には、これを行うのに最適な場所はデータベース(またはある種のストア)にあります。少しやり過ぎに見えるかもしれませんが、それが彼らの目的です

他の2つのポイント:

  1. 誰かが以前に他のメソッドに移動せずにRegisterControllerIndexメソッドをヒットする可能性があります。その場合、コードは壊れます。

  2. 複数のウィザードスタイルのプロセスを実行している場合は、データを部分的な状態でデータベースに保存し、最後の画面でのみプロセスを完了してみませんか?このように、彼らがどこで停止/開始するか、またはそれを再び拾うかに関係なく、あなたは彼らがプロセスのどこにいるかを常に知るでしょう。

于 2012-09-04T23:53:35.187 に答える
0

結果をキャッシュまたはデータベースに保存するか、コントローラー間で投稿/クエリ文字列として渡します。TempDataは、ステップ間で確実に発生する可能性のあるワーカープロセスのリセットを含むいくつかのことによってクリアされます。

さらに、上記のコードはnullref例外を取得する可能性があります。

EnrollModel enrollModel = TempData["EnrollModel"] as EnrollModel;
if(enrollModel==null)
{
//handle this model being null
}
model.ClientType = enrollModel.ClientType;

上記のように問題を修正することは、すべてのコードを確認したり、それを参照している/参照していない可能性のあるものが他にあるかどうかを知ることなく困難です。

于 2012-09-04T23:33:25.850 に答える