ฉันมีแอป MVC และฉันประสบปัญหากับเบราว์เซอร์หลายแท็บสมัยใหม่
ฉันมีหน้าจอที่สร้างโมเดลและเก็บไว้ใน this.TempData["MyViewModel"]
จากนั้นฉันก็เปิดหน้าจอเดียวกันในแท็บที่ 2 และเมื่อมันเรียกวิธีการควบคุมเดียวกันนี้ 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 เพื่อดึง viewmodel ของฉันจาก 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);
}
Session
BIG NO NO! เพียงแค่ให้แท็บของคุณอยู่ในมุมมองบางส่วนและโหลดเนื้อหาใหม่ผ่าน ajax เมื่อคลิก? บางอย่างเช่นสิ่งที่คุณสามารถทำได้ด้วยแท็บ jQuery จะทำให้คุณไม่ต้องปวดหัว - person mattytommo   schedule 21.05.2012