MVC Persist Model ต่อแท็บเบราว์เซอร์

ฉันมีแอป 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);
}

person Community    schedule 21.05.2012    source แหล่งที่มา
comment
ทำไมคุณถึงเก็บโมเดลของคุณไว้ใน Session BIG NO NO! เพียงแค่ให้แท็บของคุณอยู่ในมุมมองบางส่วนและโหลดเนื้อหาใหม่ผ่าน ajax เมื่อคลิก? บางอย่างเช่นสิ่งที่คุณสามารถทำได้ด้วยแท็บ jQuery จะทำให้คุณไม่ต้องปวดหัว   -  person mattytommo    schedule 21.05.2012
comment
ฉันใช้ TempData ซึ่งคงอยู่เพียง 1 คำขอต่อไปนี้หลังจากคำขอที่ตั้งค่าไว้ ฉันจำเป็นต้องคงมุมมองโมเดลไว้ระหว่างคำขอคอนโทรลเลอร์สองสามคำขอ ดังนั้นนี่คือสิ่งที่ TempData เหมาะอย่างยิ่ง ปัญหาคือ TempData เช่น ViewData เป็นพจนานุกรมที่มีคีย์แบบสตริงซึ่งหากฮาร์ดโค้ดเป็นค่าเช่น MyViewModel จะถูกเขียนทับโดยแท็บอื่นในเบราว์เซอร์หากแท็บนั้นกำลังดูหน้าเดียวกันด้วย สิ่งที่ฉันต้องการคือที่เก็บข้อมูล TempData (หรือสิ่งที่ชอบ) ที่ไม่ซ้ำกันต่อแท็บ   -  person    schedule 22.05.2012


คำตอบ (1)


ตามค่าเริ่มต้น ฉันเชื่อว่า MVC ใช้สถานะเซสชันเพื่อจัดเก็บ TempData โดยใช้ SessionStateTempDataProvider ดังนั้นแต่ละ TempData จะถูกเก็บไว้ในที่เดียวกันสำหรับเซสชันนั้น การใช้เซสชันสิ่งเดียวที่ฉันเห็นได้คือใช้ตัวระบุตามที่คุณแนะนำ

อย่างไรก็ตาม คุณสามารถใช้อินเทอร์เฟซ ITempDataProvider เพื่อใช้ผู้ให้บริการของคุณเองซึ่งสามารถจัดเก็บข้อมูลนี้ไว้ในที่จัดเก็บข้อมูลรูปแบบอื่น (เช่น คุกกี้หรือ sql)

person Stuart    schedule 21.05.2012