2012-04-04 7 views
0

MVC 4とMVC Futures [Serializable]機能を使用して、複数ステップのウィザードでデータを保持しています。ウィザード自体は、ユーザーから情報を収集し、その入力に基づいて自動応答を生成するだけです。入力をDBに永続的に保存する必要はありません。ページを更新すると入力がリセットされます - これを避けることは可能でしょうか?

ここで、私はウィザードの確認ページで処理できる問題に遭遇しましたが、その必要性を取り除くことができるかどうかは疑問です。私の問題は、ユーザーが特定のステップですべての入力を「リフレッシュ/ F5」していることを知っていれば、すべての前のステップが消去されるということです。彼らが確認の前に最後のステップにいる場合、彼らは彼らが前のステップで入力したすべてをクリアしたことを認識しません。これを処理する方法は確認ページに検証サマリを入れることで、すべての入力をやり直す必要があることを示します。これは、ユーザーエクスペリエンスを破壊するため(すべての手順をやり直して再入力する必要があるため)、問題が発生します。ここで

は私のコントローラのコードのサンプルです:

//This is the serialization: 
private MyData myData; 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var serialized = Request.Form["myData"]; 
     if (serialized != null) //Form was posted containing serialized data 
     { 
      myData = (MyData)new MvcSerializer().Deserialize(serialized, SerializationMode.Signed); 
      TryUpdateModel(myData); 
     } 
     else 
      myData = (MyData)TempData["myData"] ?? new MyData(); 
    } 
    protected override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if (filterContext.Result is RedirectToRouteResult) 
      TempData["myData"] = myData; 
    } 
... 
//This shows a mid-step in the wizard - only as an example: 
public ActionResult Step2(string backButton, string nextButton) 
{ 
    if (backButton != null) 
     return RedirectToAction("Step1"); 
    else if ((nextButton != null) && ModelState.IsValid) 
     return RedirectToAction("Step3"); 
    else 
     return View("Step2", myData); 

私はページを更新含め、[Serializable]TempDataSessionOutputCacheなどに関連する様々なものに今朝、昨日ほとんどを研究してきたとデータは永続していますが、ポイント上に何も見つかりません。

returnコールでは、特定のものすべての後に発生する唯一のことがありました。ActionResult。それが正しいのかどうかは分かりませんが、ページがリフレッシュされると、モデルが最後までヒットしていないため、この状況で入力されたすべてのデータが消えてしまいます。しかし、それが問題なら、私はすでに持っているコードを壊すことなくそれを解決する方法を見つけることができません。

どのようなガイダンスもありがとうございます。

P.S. MVC 4用のタグはありませんので、MVC 3を選択しました。

答えて

0

問題はTempDataにあります。あなたのケースではリダイレクトである単一のリクエストに対してのみ、内部に保存されたデータは存続します。

第1の可能性は、TempDataをに長いため、データを維持することです:ちょっと以上のセッションにそれを同化

... 
else 
{ 
    myData = (MyData)TempData["myData"] ?? new MyData(); 
    TempData.Keep(); 
} 

。したがって、TempDataの代わりにSessionを使用することができます。

もう1つの解決策は、データベース内の一部のテンポラリテーブルに各ステップのデータを格納し、各ステップでデータベースを取得できるようにすることです。私はあなたがこのステップを完了したばかりの最後のステップだけでなく、すべてのステップでこの問題を抱えていると思います。とにかく、最後のステップだけを心配しているのであれば、なぜかデータをデータベースに保存しないのはなぜですか?

+0

これはうまくいきました。不思議なことに、OnResultExecutedに入れてみましたが、うまくいきました。あなたの最後の質問への短い答え:私はプログラマーではありません。長い答え:私はステップだけを必要とします。最終的な結果は、ユーザーの選択に基づいたユーザーの自動応答(何かの計算された合計か、状況の一般的評価かにかかわらず)です。私は他のシナリオでデータを保持することを望んでいますが、これだけではありません。 – REMESQ

関連する問題