1) TempData
Memungkinkan Anda menyimpan data yang akan bertahan untuk pengalihan. Secara internal ia menggunakan Sesi sebagai backing store, setelah pengalihan dibuat data secara otomatis diusir. Polanya adalah sebagai berikut:
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
Memungkinkan Anda menyimpan data dalam aksi pengontrol yang akan digunakan dalam tampilan yang sesuai. Ini mengasumsikan bahwa tindakan mengembalikan tampilan dan tidak mengarahkan. Hidup hanya selama permintaan saat ini.
Polanya adalah sebagai berikut:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
dan dalam tampilan:
@ViewBag.Foo
atau dengan ViewData:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
dan dalam tampilan:
@ViewData["Foo"]
ViewBag
hanya pembungkus dinamis ViewData
dan hanya ada di ASP.NET MVC 3.
Dikatakan demikian, tidak satupun dari dua konstruksi itu yang boleh digunakan. Anda harus menggunakan model tampilan dan tampilan yang sangat diketik. Jadi pola yang benar adalah sebagai berikut:
Lihat model:
public class MyViewModel
{
public string Foo { get; set; }
}
Tindakan:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Tampilan sangat diketik:
@model MyViewModel
@Model.Foo
Setelah pengantar singkat ini, mari jawab pertanyaan Anda:
Persyaratan saya adalah saya ingin menetapkan nilai dalam satu pengontrol, pengontrol itu akan mengarahkan ulang ke ControllerTwo dan Controller2 akan membuat tampilan.
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);
}
}
dan tampilan yang sesuai ( ~/Views/Two/Index.cshtml
):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
Ada juga kelemahan menggunakan TempData: jika pengguna menekan F5 pada halaman target, data akan hilang.
Secara pribadi saya juga tidak menggunakan TempData. Itu karena secara internal menggunakan Sesi dan saya menonaktifkan sesi di aplikasi saya. Saya lebih suka cara yang lebih tenang untuk mencapai ini. Yaitu: dalam tindakan pengontrol pertama yang melakukan pengalihan menyimpan objek di penyimpanan data Anda dan pengguna id unik yang dihasilkan saat mengarahkan. Kemudian pada tindakan target gunakan id ini untuk mengambil kembali objek yang awalnya disimpan:
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);
}
}
Tampilannya tetap sama.