2

MVC アプリを使用していますが、最新のマルチタブ ブラウザーで問題が発生しました。

モデルを作成して this.TempData["MyViewModel"] に保存する画面があります

次に、2 番目のタブで同じ画面を開き、同じコントローラー メソッドを呼び出すと、this.TempData["MyViewModel"] が再度設定されます。

その後、タブ 1 に戻ってページを更新すると、タブ 2 で入力したデータが表示されます。

ブラウザのタブごとに一意に TempData にデータを保存する方法はありますか?

一意の TempData キーを作成し、クエリ文字列または非表示フィールドを使用してリクエスト間で保持するというアイデアをいじりましたが、これは面倒です。

どんなアイデアやアドバイスも大歓迎です。:o)


私がこれまでに持っているのは、「ProcessID」の概念です。

最初の部分ビューでは、Model.ProcessID に緩やかにバインドされた非表示フィールドを持つフォームがあります。フォームが投稿されると、この隠しフィールド ProcessID が TempData キーとして使用されます...

例:

public sealed class MyViewModel
{
    public MyViewModel()
    {
        this.ProcessID = Guid.NewGuid().ToString();
    }

    public string ProcessId { get; set; }
    // other fields
}

部分図 1:

@model Models.MyViewModel

@using (Ajax.BeginForm("PartialView1", "Home", new { }, new AjaxOptions() { UpdateTargetId = "myDivToUpdate" }, new { }))
{
    @Html.HiddenFor(m => m.ProcessId);

    // other fields...

    <input type="submit" value="next" />
}

public ActionResult PartialView1(FormCollection form)
{
    return this.PartialView("PartialView1", new Models.MyViewModel());
}

[HttpPost]
public ActionResult PartialView1(FormCollection form)
{    
    Models.MyViewModel vm = new Models.MyViewModel();    

    this.UpdateModel(vm, form);

    this.TempData[vm.ProcessId] = vm;

    return this.PartialView("PartialView2", vm);
} 

2 番目の部分ビュー フォームでは、同じ Model.ProcessID に緩やかにバインドされた非表示フィールドが再びあります。このフォームが投稿されたら、Model.ProcessID を使用して、TempData からビューモデルを取得し、更新できます。

部分図 2:

@model Models.MyViewModel

@using (Ajax.BeginForm("PartialView2", "Home", new { }, new AjaxOptions() { UpdateTargetId = "myDivToUpdate" }, new { }))
{
    @Html.HiddenFor(m => m.ProcessId);

    // other fields (different to partial view 1)...

    <input type="submit" value="finish" />
}

[HttpPost]
public ActionResult PartialView2(FormCollection form, Models.MyViewModel vm)
{
    vm = (this.TempData[vm.ProcessId] as Models.MyViewModel);

    this.UpdateModel(vm, form);

    return this.Json(new { result = true, message = "success" }, JsonRequestBehavior.AllowGet);
}
4

1 に答える 1

0

デフォルトでは、MVC はセッション状態を使用して、SessionStateTempDataProvider を使用して TempData を保存するため、各 TempData はそのセッションの同じ場所に保存されると思います。私が見ることができる唯一のセッションの使用は、あなたが提案したようにいくつかの識別子を使用することです。

ただし、ITempDataProvider インターフェイスを実装して独自のプロバイダーを使用し、このデータを他の形式のストレージ (Cookie や SQL など) に保存することができます。

于 2012-05-21T16:12:12.580 に答える