- ViewData
- ViewBag
- TempData
Bu üç yapının kullanımı birbirine çok yakın olsa da önemli farklılıkları vardır. Şimdi bunları sırasıyla inceleyelim.
ViewData
Controller sınıfından view sayfalarına viewdatadictionary sınıfı ile veri taşınır.
ViewData ViewDatadictionary sınıfından türetilen bir dictionary nesnesidir. Dictionary mantığıyla kurgulanmıştır. Veri transfer işlemlerinde "key-value" eşleşmesinden faydalanır. Key değeri olarak string tanımlamayı kabul eder.
- ViewData kullanarak Controller üzerinden View tarafına veri çekmek için kullanılır. Tersi yapılamaz.
- Sadece geçerli istek sırasında okunabilir sonrasında yönlendirmeden sonra değeri null olacaktır.
- Veriyi değişkene almak için tip dönüşümü yapmamız gerekli.
ViewBag
- ViewBag, C# 4.0 ile gelen dinamik veri tipi özelliklerinden faydalanır, hataları runtime zamanında alınır.
- Temelde ViewData gibi Controller üzerinden View tarafına veri çekmek için kullanılır.
- Sadece geçerli istek sırasında okunabilir.
- Yönlendirme sonrasında kendini imha eder, null değer alır.
- Veriyi değişkene almak için tip dönüşümü yapmanız gerekmez.
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.
- 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.
- Farklı metotlardan çağırıp kullanabiliriz.
Şimdi bu durumları örnek ile açıklamaya çalışalım.
Boş bir MVC projesi oluşturup;
- AnasayfaController ve IletisimController adında iki adet Controller oluşturalım. Varsayılan ActionResult metodları ise Index() olarak belirleyelim.
- Controller'lar oluştu, bunlara ait View'lar oluşturalım.
Bu aşamalardan sonra proje yapısının nasıl olduğuna dair ekran görüntüsü paylaşalım.
Proje Yapısı
Klasör yapısı hakkında biraz fikir edindikten sonra AnasayfaController, IletisimController, Anasayfa Index.cshtml ve Iletisim Index.cshtml yapılarını oluşturalım.
AnasayfaController
public class AnasayfaController : Controller { public IActionResult Index() { ViewData["AnasayfaViewDataVerisi"] = "ViewData içerisindeki veriler"; ViewBag.AnasayfaViewBagVerisi = "ViewBag içerisindeki veriler"; TempData["AnasayfaTempDataVerisi"] = "TempData içerisindeki veriler"; return View(); } }
Anasayfa Index.cshtml
<div class="text-center"> <h4>Burası Anasayfa</h4> <p class="alert alert-info"> <strong>ViewData["AnasayfaViewDataVerisi"]:</strong> @ViewData["AnasayfaViewDataVerisi"] </p> <p class="alert alert-info"> <strong>ViewBag.AnasayfaViewBagVerisi:</strong> @ViewBag.AnasayfaViewBagVerisi </p> <p class="alert alert-info"> <strong>TempData["AnasayfaTempDataVerisi"]:</strong> @TempData["AnasayfaTempDataVerisi"] </p> </div>Kod kısımlarını tamamladık. Projemizi çalıştırıp ekran görüntüsü paylaşalım.
Anasayfa Görünümü
AnasayfaController'daki değerleri Anasayfa Index.cshtml içerisinden alabiliyoruz. Peki bir sonraki "Iletisim Index.cshtml" sayfasına ilerlediğimizde bu verileri alabilecek miyiz? Iletisim linkine tıklayalım.
Iletisim Linkine Tıkladığımızda
AnasayfaController Veri Taşıma Değişikliği
public class AnasayfaController : Controller { public IActionResult Index() { ViewData["AnasayfaViewDataVerisi"] = "ViewData içerisindeki veriler"; ViewBag.AnasayfaViewBagVerisi = "ViewBag içerisindeki veriler"; TempData["AnasayfaTempDataVerisi"] = "TempData içerisindeki veriler"; return RedirectToAction("Index", "Iletisim"); } }
AnasayfaController'ı çalıştırdığımızda bizi /Iletisim/Index sayfasına yönlendirecektir. O sayfanın View kısmında ViewBag, ViewData ve TempData içerisindeki değerleri ekrana yazdırmaya çalışalım.
Iletisim Sayfası
Görüldüğü gibi sadece TempData içerisindeki veri diğer sayfaya taşınabildi. ViewBag ve ViewData değerleri çalışma esnasında (Runtime) oluşturulduğu için Controller'ın kendisine ait View'nda görüntülenebilmektedir.
Projeyi Github üzerinden indirmek için tıklayınız.