1) TempData
Yönlendirme için hayatta kalacak verileri depolamanızı sağlar. Dahili olarak Oturumu destek deposu olarak kullanır, yönlendirme yapıldıktan sonra veriler otomatik olarak çıkarılır. Desen aşağıdaki gibidir:
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
Verileri, karşılık gelen görünümde kullanılacak bir denetleyici eyleminde depolamanızı sağlar. Bu, eylemin bir görünüm döndürdüğünü ve yönlendirmediğini varsayar. Sadece mevcut istek sırasında yaşıyor.
Desen aşağıdaki gibidir:
public ActionResult Foo()
{
ViewBag.Foo = "bar";
return View();
}
ve görünümde:
@ViewBag.Foo
veya ViewData ile:
public ActionResult Foo()
{
ViewData["Foo"] = "bar";
return View();
}
ve görünümde:
@ViewData["Foo"]
ViewBagyalnızca dinamik bir pakettir ViewDatave yalnızca ASP.NET MVC 3'te bulunur.
Bununla birlikte, bu iki yapının hiçbiri kullanılmamalıdır. Görünüm modellerini ve güçlü yazılan görünümleri kullanmalısınız. Böylece doğru desen aşağıdaki gibidir:
Modeli görüntüle:
public class MyViewModel
{
public string Foo { get; set; }
}
Aksiyon:
public Action Foo()
{
var model = new MyViewModel { Foo = "bar" };
return View(model);
}
Güçlü yazım görünümü:
@model MyViewModel
@Model.Foo
Bu kısa tanıtımdan sonra sorunuza cevap verelim:
Benim gereksinimim, bir denetleyicide bir değer ayarlamak istiyorum, bu denetleyici ControllerTwo'ya yönlendirecek ve Controller2 Görünümü oluşturacaktır.
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);
}
}
ve ilgili görünüm ( ~/Views/Two/Index.cshtml):
@model MyViewModel
@Html.DisplayFor(x => x.Foo)
TempData kullanmanın dezavantajları vardır: kullanıcı hedef sayfada F5'e basarsa veriler kaybolur.
Şahsen ben TempData kullanmıyorum. Çünkü dahili olarak Session kullanıyor ve uygulamalarımdaki oturumu devre dışı bırakıyorum. Bunu başarmak için daha RESTful bir yol tercih ederim. Hangi: yönlendirmeyi gerçekleştiren ilk denetleyici eyleminde, nesneyi veri deponuzda depolayın ve yeniden yönlendirme sırasında oluşturulan benzersiz kimliği kullanın. Ardından hedef eylemde, başlangıçta depolanan nesneyi geri almak için bu kimliği kullanın:
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);
}
}
Görünüm aynı kalır.