1) TempData
ช่วยให้คุณเก็บข้อมูลที่จะอยู่รอดได้สำหรับการเปลี่ยนเส้นทาง ภายในจะใช้เซสชันเป็นที่เก็บข้อมูลสำรองหลังจากทำการเปลี่ยนเส้นทางข้อมูลจะถูกขับออกโดยอัตโนมัติ รูปแบบดังต่อไปนี้:
public ActionResult Foo()
{
// store something into the tempdata that will be available during a single redirect
TempData["foo"] = "bar";
// you should always redirect if you store something into TempData to
// a controller action that will consume this data
return RedirectToAction("bar");
}
public ActionResult Bar()
{
var foo = TempData["foo"];
...
}
2) ViewBag, ViewData
ช่วยให้คุณสามารถเก็บข้อมูลในการดำเนินการควบคุมที่จะใช้ในมุมมองที่สอดคล้องกัน นี่ถือว่าการกระทำนั้นส่งคืนมุมมองและไม่เปลี่ยนเส้นทาง อาศัยอยู่เฉพาะในระหว่างการร้องขอปัจจุบัน
รูปแบบดังต่อไปนี้:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
และในมุมมอง:
@ViewBag.Foo
หรือด้วย ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
และในมุมมอง:
@ViewData["Foo"]
ViewBag
เป็นเพียง wrapper แบบไดนามิกรอบ ๆViewData
และมีอยู่ใน ASP.NET MVC 3 เท่านั้น
สิ่งนี้ถูกกล่าวว่าไม่ควรใช้สิ่งก่อสร้างทั้งสองนี้ คุณควรใช้โมเดลมุมมองและมุมมองที่พิมพ์อย่างรุนแรง ดังนั้นรูปแบบที่ถูกต้องคือ:
ดูรุ่น:
public class MyViewModel
{
public string Foo { get; set; }
}
หนังบู๊:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
มุมมองที่พิมพ์อย่างมาก:
@model MyViewModel
@Model.Foo
หลังจากการแนะนำสั้น ๆ นี้เราจะตอบคำถามของคุณ:
ความต้องการของฉันคือฉันต้องการตั้งค่าในคอนโทรลเลอร์หนึ่งคอนโทรลเลอร์นั้นจะเปลี่ยนเส้นทางไปยัง ControllerTwo และ Controller2 จะแสดงมุมมอง
public class OneController: Controller
{
public ActionResult Index()
{
TempData["foo"] = "bar";
return RedirectToAction("index", "two");
}
}
public class TwoController: Controller
{
public ActionResult Index()
{
var model = new MyViewModel
{
Foo = TempData["foo"] as string
};
return View(model);
}
}
และมุมมองที่สอดคล้องกัน ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
มีข้อเสียของการใช้ TempData เช่นกัน: หากผู้ใช้เยี่ยมชม F5 ในหน้าเป้าหมายข้อมูลจะหายไป
ส่วนตัวฉันไม่ได้ใช้ TempData เป็นเพราะภายในใช้เซสชันและฉันปิดใช้งานเซสชันในแอปพลิเคชันของฉัน ฉันชอบวิธีที่สงบมากขึ้นเพื่อบรรลุเป้าหมายนี้ ซึ่งคือ: ในการดำเนินการควบคุมครั้งแรกที่ดำเนินการจัดเก็บการเปลี่ยนเส้นทางวัตถุในที่เก็บข้อมูลของคุณและผู้ใช้ ID ที่ไม่ซ้ำกันสร้างขึ้นเมื่อเปลี่ยนเส้นทาง จากนั้นในการดำเนินการเป้าหมายให้ใช้รหัสนี้เพื่อดึงวัตถุที่เก็บไว้ในตอนแรกกลับมา:
public class OneController: Controller
{
public ActionResult Index()
{
var id = Repository.SaveData("foo");
return RedirectToAction("index", "two", new { id = id });
}
}
public class TwoController: Controller
{
public ActionResult Index(string id)
{
var model = new MyViewModel
{
Foo = Repository.GetData(id)
};
return View(model);
}
}
มุมมองยังคงเหมือนเดิม