1) TempData
Cho phép bạn lưu trữ dữ liệu sẽ tồn tại để chuyển hướng. Trong nội bộ, nó sử dụng Phiên làm cửa hàng sao lưu, sau khi chuyển hướng được thực hiện, dữ liệu sẽ tự động bị xóa. Mô hình như sau:
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
Cho phép bạn lưu trữ dữ liệu trong một hành động của bộ điều khiển sẽ được sử dụng trong chế độ xem tương ứng. Điều này giả định rằng hành động trả về một khung nhìn và không chuyển hướng. Chỉ sống trong yêu cầu hiện tại.
Mô hình như sau:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
và theo quan điểm:
@ViewBag.Foo
hoặc với ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
và theo quan điểm:
@ViewData["Foo"]
ViewBag
chỉ là một trình bao bọc động xung quanh ViewData
và chỉ tồn tại trong ASP.NET MVC 3.
Điều này đang được nói, không ai trong số hai cấu trúc đó nên được sử dụng. Bạn nên sử dụng các mô hình xem và các khung nhìn được gõ mạnh. Vì vậy, mô hình chính xác là như sau:
Xem mô hình:
public class MyViewModel
{
public string Foo { get; set; }
}
Hoạt động:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Quan điểm đánh máy mạnh mẽ:
@model MyViewModel
@Model.Foo
Sau phần giới thiệu ngắn gọn này, hãy trả lời câu hỏi của bạn:
Yêu cầu của tôi là tôi muốn đặt một giá trị trong bộ điều khiển, bộ điều khiển đó sẽ chuyển hướng đến ControllerTwo và Controller2 sẽ hiển thị Chế độ xem.
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);
}
}
và khung nhìn tương ứng ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Cũng có những hạn chế khi sử dụng TempData: nếu người dùng nhấn F5 trên trang đích, dữ liệu sẽ bị mất.
Cá nhân tôi cũng không sử dụng TempData. Đó là bởi vì bên trong nó sử dụng Phiên và tôi vô hiệu hóa phiên trong các ứng dụng của mình. Tôi thích một cách RESTful hơn để đạt được điều này. Đó là: trong hành động điều khiển đầu tiên thực hiện chuyển hướng lưu trữ đối tượng trong kho lưu trữ dữ liệu của bạn và sử dụng id duy nhất được tạo khi chuyển hướng. Sau đó, trên hành động đích sử dụng id này để tìm nạp lại đối tượng được lưu trữ ban đầu:
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);
}
}
Quan điểm vẫn giữ nguyên.