ViewData vs ViewBag vs TempData Hangisini Kullanmalıyız?

ViewData, TempData ve ViewBag Controller’dan View’e veri taşımak için kullanılır. Session gibi saklama yöntemleri de vardır ancak asıl kullanım amacı MVC’deki Controller to View’e veri taşımaya hizmet etmez. İçlerinden sadece TempData yönlendirildiği zaman verisini koruyabilir. Aşağıda üç nesnenin de açıklamasını ve örnek kodlarını ekledim.

ViewBag nedir? ve ViewBag Kullanımı

ViewBag Controller’dan View’e veri aktarmak için kullanılır ve .net mvc 3.0 ile kullanıma sunulmuştur. ViewBag dinamik değerleri işleme özelliğine sahiptir yani type casting (tip dönüştürme) yapmamıza gerek kalmazken buna karşın ViewData’ya oranla daha yavaştır.

Örnek ViewBag Kodu:

//Controller'dayız
public ActionResult Index()
{
      List<string> OgrenciListesi = new List<string>();
      OgrenciListesi.Add("Hüseyin");
      OgrenciListesi.Add("Veli");
      OgrenciListesi.Add("Ali");

      ViewBag.Ogrenciler = OgrenciListesi;
      return View();
}

//View'deyiz
<ul>
    @foreach (var ogrenci in ViewBag.Ogrenciler)
     {
        <li>@ogrenci</li>
     }
</ul>

Örnekteki gibi, ViewBag.Ogrenciler şeklinde önceden tanımlanmamış şekilde isimlendirilebilir ve html tarafında herhangi bir tipe dönüştürülmeden kullanılabilir.

ViewData Nedir? ve ViewData Kullanımı

En basit ifadeyle ViewData, Controller’dan View’a değer taşımak için kullanılır. Uygulamada dikkat etmemiz gereken bir husus; sadece geçerli istek için kullanılabilir yönlendirme yaptığımız zaman çalışmayacaktır. ViewData, Kullanmak istediğimiz yerde çağırırken tip dönüşümü yapmalıyız buna karşın viewbag’a oranla daha hızlıdır. Mvc 1.0’da kullanıma sunulmuştur. ViewDataDictionary sınıfının bir örneğinin alınmış hali gibi çalışır. Key değeri string iken value kısmı object’dir bu yüzden kullanırken orjinal türüne döndürmemiz gerekir ayrıca nesne olduğundan NULL kontrolü yapılması gerekir. Controller’da kullanımı ViewData[“Ogrenciler”] şeklindedir ve vereceğimiz anahtar kelime atanır ve çağrılır.

Örnek ViewData Kodu:

//Controller'dayız
public ActionResult Index()
{
      List<string> OgrenciListesi = new List<string>();
      OgrenciListesi.Add("Hüseyin");
      OgrenciListesi.Add("Veli");
      OgrenciListesi.Add("Ali");

      ViewData["Ogrenciler"] = OgrenciListesi;
      return View();
}
//View'deyiz
<ul>
    @foreach (var student in ViewData["Ogrenciler"] as List<string>)
    {
       <li>@student</li>
    }
</ul>

TempData Nedir? ve TempData Kullanımı

TempData, Controller’dan View’e geçici olarak değer taşımak için kullanılır. Ömrü ise, sadece geçerli istek ve sonraki istek kadardır. Yani iki ardışık istek arasında veri saklayabilir. Genellikle benim gibi tek seferlik ekrana yazdırmak istediğim mesajları yazdırmak için kullanılır. Genellikle üye olma veya giriş sayfalarında kullanıcı veya şifre yanlışsa TempData[“LoginStatus”] = “bilgileriniz hatalı” şeklinde gösteririm. TempData, ViewData gibi üst sınıftan (TempDataDictionary) türetilmiştir.

TempData’da aktarmak istediklerimiz nesne olarak saklandığından kullanacağımız yerde tip dönüştürme yapmak zorundayız. Ayrıca NULL kontrolü de gerektirir. TempData, ViewData’nın aksine yönlendirmede veri taşımada kullanılabilir. Hatta geçici olarak saklandığından bu iş için kullanışlıdır diyebiliriz..

Kullanım şekli ViewData ile birebir aynıdır fakat yaşam süreleri farklı ve ek olarak yönlendirmede veri taşımayı destekler.

Örnek TempData Kodu:

//Controller'dayız
public ActionResult Index()
{
    List<string> OgrenciListesi = new List<string>();
    OgrenciListesi.Add("Hüseyin");
    OgrenciListesi.Add("Veli");
    OgrenciListesi.Add("Ali");

    TempData["Ogrenciler"] = OgrenciListesi;
    return View();
}
//View'deyiz
<ul>
    @foreach (var student in TempData["Ogrenciler"] as List<string>)
    {
       <li>@student</li>
    }
</ul>

ViewData vs ViewBag vs TempData arasındaki farkları ve hangi durumlarda hangisini kullanmalıyız, aşağıdaki tablo umarım bu konuda işinize yarar.

ViewDataViewBagTempData
Key-Value dictionary koleksiyonudur.Dinamik çalışacak şekilde kullanılır.Key-Value dictionary koleksiyonudur.
ViewData bir dictionary nesnesidir ve ControllerBase sınıfının bir özelliğidir.ViewBag, ControllerBase sınıfının dinamik özelliğidir.ViewData bir dictionary nesnesidir ve ControllerBase sınıfının bir özelliğidir.
ViewData, ViewBag’den daha hızlıdır.ViewData’ya göre yavaştır.
ViewData, MVC 1.0’da hayata başladı. 1.0 ve üzeri sürümlerde kullanılabilir.ViewBag MVC 3.0’da hayata başladı. 3.0 ve üzeri sürümlerde kullanılabilir.TempData MVC 1.0’da hayata başladı. 1.0 ve üzeri sürümlerde kullanılabilir.
ViewData .net 3.5 ve üzeri sürümlerle çalışır.ViewBag .net 4.0 ve üzeri sürümlerle çalışır.TempData .net 3.5 ve üzeri sürümlerle de çalışır.
Kullanım sırasında tür dönüşüm gerektirir. Ama daha hızlıdır.ViewBag dinamik olarak kullanıldığı için çağrıldığı yerlerde tür dönüşümüne gerek yoktur. Ama daha yavaştır.Kullanım sırasında tür dönüşüm gerektirir.
Yönlendirme meydana gelirse değeri null olur.Yönlendirme meydana gelirse değeri null olur (ViewData ile aynı).TempData, iki ardışık istek arasında veri aktarmak için kullanılır.
Sadece mevcut istek sırasında çalışır.Sadece mevcut istek sırasında çalışır.TempData yalnızca geçerli ve sonraki istek sırasında çalışır.
ViewData VS ViewBag Vs TempData aralarındaki farklar nelerdir?