11 Mart 2015 Çarşamba

Asp.Net MVC 3 ViewBag ve ViewData Arasındaki Fark -6

Asp.Net MVC 3 içerisinde Controller sınıfının view’e gönderdiği nesnelerin bilgileri  Controller’in miras aldığı ControllerBase sınıfı üzerinde yer alan ViewBag ya da ViewData propertylerinde tutulmakta.Böylece Controller üzerinden gelen bilgiler sayfa render edilirken ilgili alanlara aktarılmakta. WebForms ile çalışanların hatırlayacağı üzere bu 2 property ViewState’in MVC tarafındaki işlevselliğini yapıyor denilebilir ama ViewState’den davranışsal temel farkı üretilen sayfa üzerinde herhangi bir ekstra html içerik üretmemesidir.
Peki bu 2 özellik arasında ne gibi bir fark.Neden aynı işlevi yapan 2 farklı özellik var. Bu sorunun basit cevabı:
ViewBag ile ViewData arasından birisini seçmek açısından gerçek anlamda teknik olarak bir avantaj yok.Gerçek anlamda ile kasıt ikisi de aynı işlevi yapmakta ama fark biri yerine diğeri kullanılmasından kaynaklanacak sonuçlar. Temel fark ViewBag’in dinamik bir tip olması. Dinamik tip (dynamic)  tip kontrolü işlemine derleme anı (compile time) yerine çalışma anı (runtime) seviyesinde izin verdiğinden bu durumdan kaynaklanan farklılıklar mevcut.
  1.Fark
ViewBag, key’e ulaşılmaya çalışıldığında sadece C#’da geçerli olan bir tanımlayıcı olması durumunda çalışır.
1
ViewData["Status Code"];
şeklinde tanımlanan bir status code değerine ViewBag ile ulaşılamaz.Çünkü
1
ViewBag.Status Code
hatalı bir tanımlama‘dır.
 2.Fark
Dinamik değerler genişletme metodlarına (extension methods) parametre olarak gönderilemezler.Çünkü C# derleyicisi derleme anında  her parametrenin gerçek tipini bilmek zorundadır doğru genişletme metodunu çağırabilmek için.
1
@Html.TextBox("name",ViewBag.Name)
hatalı bir tanımlama‘dır. Şu şekilde yapılabilir:
1
2
3
4
5
//Birinci Alternatif
ViewData["name"]
//İkinci Alternatif
(string) ViewBag.Name
Kaynak:
Diğer bir ViewBag Örnek Kullanım;
HomeController’da Index() methoduna gidelim. 
public ActionResult Index()
{
ViewBag.Message = “Hoşgeldiniz ASP.NET MVC!”;
var yazilimgelistir = new List<string>
{
“Hasan KAÇAN”,”Ali UÇAN”,”Veli BİLEN”,”Halis GÖREN”,”Kemal ÖRTEN”
};
ViewBag.yazilimgelistir = yazilimgelistir;
return View();
}
index.aspx içine razor yapıda kodu yazıyoruz.
<h2>@ViewBag.Message</h2>
<ul>
@foreach (var gelistirici in ViewBag.yazilimgelistir)
{
<li>
@gelistirici
</li>
}
</ul>
Diğer bir ViewData Örnek Kullanım;
HomeController’da Index() methoduna gidelim. 
public ActionResult Index()
{
var yazilimgelistir = new List<string>
{
“Hasan KAÇAN”,”Ali UÇAN”,”Veli BİLEN”,”Halis GÖREN”,”Kemal ÖRTEN”
};
ViewData[“yazilimgelistir”] = yazilimgelistir;
return View();
}
index.aspx içine razor yapıda kodu yazıyoruz.
<ul>
@foreach (var gelistirici in (List<string>)ViewData[“yazilimgelistir”])
{
<li>
@gelistirici
</li>
}
</ul>

Hiç yorum yok :

Yorum Gönder