Bu makalemizde MVC üzerinde Controller view arası veri taşıma işlemlerinde kullanılan yapılardan bahsedeceğim. Veri taşıma işlemlerinde en çok kullanılan ViewBag ViewData TempData yapısıdır. Bu üç yapının kullanımı birbirine çok yakın olsa da önemli farklılıkları vardır.
ViewBag
ViewBag Controller üzerinden View’a veri taşımak için kullanılır. Tersi durum (View -Controller) söz konusu değildir.
ViewBag dinamik bir tip olduğu için runtime da derlenir ve değişken için herhangi bir isim kullanılabilir. Controller ve View taraflı belirlenen değişken ismi doğru yazılmalıdır. Aksi durumda runtime ‘ da hata almanız kaçınılmaz olur. ViewBag ile Primitive Type ve Complex Type tanımı yapılabilir. Aynı ViewBag değişkeni için birden fazla tanım yapılırsa son tanımlama geçerli olur. ViewBag’e tanımlı bir veri Redirect veya sayfanın post olması durumunda temizlenir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
namespace bilisimIO_dataTransferred.Controllers { public class HomeController : Controller { public ActionResult Index() { ViewBag.SiteMsg = "bilisimIO"; return View(); } } } |
View üzerinden erişim
1 2 3 4 5 |
<label>Title :</label> @ViewBag.SiteMsg |
ViewData
Hemen hemen ViewBag ile aynı yapıdadır. ViewData Controller üzerinden View ‘ a transfer için kullanılır tersi durumu desteklemez. Farklı olarak Dictionary mantığıyla kurgulanmıştır. Transfer işlemlerinde Key-Value eşleşmesinden faydalanır. Key değeri olarak string tanımlama kabul eder. ViewData ekli veriyi Request bazlı saklar ve işlem yapmadan önce value TypeCast yapmalıyız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class Author() { public int Id {get;set;} public string Name {get;set;} } namespace bilisimIO_dataTransferred.Controllers { public class HomeController : Controller { public ActionResult Index() { ViewData["SiteMsg"] = "bilisimIO"; List<Author> author = new List<Author>(); author.Add(new Author(){ Id = 1, Name = "H.Burak"}); author.Add(new Author(){ Id = 2, Name = "Karadağ"}); ViewData["Authors"] = author; return View(); } |
View üzerinden erişim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<label>Title :</label> @ViewData["SiteMsg"] // //@foreach (var item in (List<Author>)ViewData["Authors"]) @foreach (var item in ViewData["Authors"] as List<Author>) { <label>@item.Id</label> @item.Name <br/> } |
TempData
ViewData ile aynı kullanımdadır. TempDataDictionary Key-Value olarak kurgulanmıştır. Diğer transfer yapılarına nazaran TempData veriyi Request bazlı saklamaz. Bu nedenle Action veya farklı Controller Action’lar arasında bir transfer işlemi yapılacaksa veya View üzeride aynı durum söz konusuysa kullanılabilir. TempData üzerindeki veriyi üçüncü Request’e aktarmak istiyorsak Keep() metodunu kullanmalıyız. Bu şekilde TempData LifeCycle kısa bir süre uzamış olur. TempData kullanımı öncesinde ViewData’da olduğu gibi TypeCast işlemi yapmalıyız.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public class HomeController : Controller { public HomeController() { } public ActionResult Index() { TempData["Id"] = "H.Burak"; TempData["Name"] = 1; return View(); } public ActionResult About() { int _id; string _name; if(TempData.ContainsKey("Id")) _id = Convert.toInt32(TempData["Id"]); if(TempData.ContainsKey("Name")) _name = TempData["Name"].ToString()); // 3. request için tempData yı saklıyoruz. TempData.Keep(); return View(); } } |
H.Burak Karadağ
Referans
Passing Data in an ASP.NET MVC Application