0

MVC4とMVCFutures[Serializable]機能を使用して、マルチステップウィザードを介してデータを永続化します。ウィザード自体は、ユーザーから情報を収集し、それらの入力に基づいて自動応答を生成するだけです。入力をDBに永続的に保存する必要はありません。

ウィザードの[確認]ページで処理できる問題が少し発生しましたが、それを回避できるかどうか疑問に思っています。私の問題は、ユーザーが「Refresh / 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。それが正しいかどうかはわかりませんが、モデルが最後までヒットされないため、ページを更新すると、この状況で入力されたすべてのデータが表示されなくなることは理にかなっています。しかし、それが問題である場合、私はすでに持っているコードを壊さずにそれを解決する方法を理解することはできません。

どんな指導にも感謝します。

PS MVC 4のタグがないため、MVCとMVC3を選択しました。

4

1 に答える 1

0

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

最初の可能性は、TempDataにデータをより長く保持することです。

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

これはちょっとそれをSessionに同化させます。したがって、TempDataの代わりにSessionを使用できます。

別の解決策は、各ステップのデータをデータベースの一時テーブルに格納して、各ステップでデータを取得できるようにすることです。要約を表示する最後のステップだけでなく、すべてのステップでこの問題が発生していると思います。とにかく、最後のステップだけを気にしているのなら、とにかくデータをデータベースに永続化してみませんか?

于 2012-04-05T06:02:18.487 に答える