ตั้งค่า Viewbag ก่อนเปลี่ยนเส้นทาง


122

เป็นไปได้ไหมที่จะตั้งค่าViewBagก่อนที่ฉันจะเรียกการเปลี่ยนเส้นทาง

ฉันต้องการสิ่งที่ชอบ:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");

คำตอบ:


242

เมื่อคุณใช้การเปลี่ยนเส้นทางคุณจะต้องไม่ใช้ViewBagแต่TempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}

1
ทำไมคุณถึงมี @ViewBag ถ้าคุณไม่อยู่ในมุมมอง
apkisbossin

6
ฉันต้องการที่จะตอบให้เสร็จสมบูรณ์เพราะฉันกำลังใช้มันและฉันประสบปัญหาเล็กน้อยนั่นคือเมื่อ TempData ว่างเปล่าด้วยเหตุผลบางประการ (ในกรณีของฉันฉันมีข้อความเฉพาะเมื่อมีการแปลง) ฉันจึงต้องทำการทดสอบว่า (TempData ["Message"]! = null) เพื่อหลีกเลี่ยงข้อผิดพลาด
Patrick

1
จะเกิดอะไรขึ้นถ้าการเปลี่ยนเส้นทางไปยังคอนโทรลเลอร์อื่น ใน ViewBag แอ็คชันของคอนโทรลเลอร์อื่น TempData และ Session ว่างเปล่าทั้งหมด!
Andrew

1
@ แอนดรูว์ดี TempData ไม่เกี่ยวข้องกับคอนโทรลเลอร์เฉพาะ บางทีคุณอาจเปลี่ยนเส้นทางมากกว่าหนึ่งครั้งและสูญเสีย TempData? คุณสามารถเชื่อมโยงไปยังคำถามใหม่พร้อมรหัส ...
Raphaël Althaus

ฉันพยายามตั้งค่าเหล่านั้นในเมตริก OnAuthorize ของแอตทริบิวต์ตัวกรอง แต่ไม่ได้ผลดังนั้นฉันจึงใช้สตริงการสืบค้นเพื่อส่งผ่านข้อมูล ในทางกลับกันการตั้งค่า TempData ในคอนโทรลเลอร์จะทำงานได้เมื่อฉันต้องอ่านในภายหลังในแอตทริบิวต์ตัวกรอง ขอบคุณ!
Andrew


8

ฉันทำแบบนี้.. และมันใช้ได้ผลสำหรับฉัน ... ที่นี่ฉันกำลังเปลี่ยนรหัสผ่านและประสบความสำเร็จฉันต้องการตั้งค่าข้อความแสดงความสำเร็จเป็น viewbag เพื่อแสดงในมุมมอง ..

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }

3

นำมาจากที่นี่

สรุป

ออบเจ็กต์ ViewData และ ViewBag ช่วยให้คุณสามารถเข้าถึงชิ้นส่วนข้อมูลพิเศษเหล่านั้นที่อยู่ข้างโมเดลของคุณอย่างไรก็ตามสำหรับข้อมูลที่ซับซ้อนมากขึ้นคุณสามารถเลื่อนขึ้นไปที่ ViewModel ได้ ในทางกลับกัน TempData ได้รับการออกแบบมาโดยเฉพาะสำหรับการทำงานกับข้อมูลบนการเปลี่ยนเส้นทาง HTTP ดังนั้นอย่าลืมระมัดระวังเมื่อใช้ TempData


-2

หรือคุณสามารถใช้ Session เพื่อเป็นทางเลือกอื่น:

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

แล้วโทรหาได้ทุกเมื่อที่คุณต้องการ

UPDATE

นอกจากนี้ตามที่ @James กล่าวไว้ในความคิดเห็นของเขาการลบหรือล้างค่าของเซสชันเฉพาะนั้นจะปลอดภัยหลังจากที่คุณใช้งานเพื่อหลีกเลี่ยงข้อมูลขยะที่ไม่ต้องการหรือค่าที่ล้าสมัย


4
ฉันไม่เห็นด้วยกับเรื่องนั้น อย่าใช้เซสชันสำหรับสิ่งนี้
Mahmoodvcs

2
เป็นอีกทางเลือกหนึ่ง เป็นที่นิยมในบางสถานการณ์
csharpforevermore

ตัวแปรเซสชันมีประโยชน์สำหรับสิ่งที่คุณต้องติดตามระหว่างโพสต์ / รับหลาย ๆ สำหรับการใช้งานแบบครั้งเดียวเช่นนี้คุณต้องจำไว้ว่าให้ล้างข้อมูลไม่เช่นนั้นจะเป็นข้อมูลขยะในภายหลังปรากฏไม่เป็นที่ต้องการบนหน้าจอบางหน้าจอหรือแม้กระทั่งทริกเกอร์ตรรกะไม่อยู่ในบริบท
เจมส์

@ เจมส์แน่นอนนั่นคือสิ่งที่ฉันทำในบางกรณีฉันต้องใช้วิธีนี้ การลบหรือล้างค่าหลังการใช้งานเป็นสิ่งจำเป็นสำหรับกรณีเช่นนี้
Jon P
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.