Sayfalar

5 Şubat 2013 Salı

ASP.NET MVC DERSLERİ ( 3.4 ) STRONGLY TYPED VIEWS

View sayfamıza bir liste göndereceğimizi düşünelim. Bunu nasıl yapabiliriz. Birinci olarak viewdata nesnelerinden bir tanesi ile olabilir. Örneğin ViewBag ile;

Controller
public ActionResult List() 
{
    var products = new List<Products>();
    for(int i = 0; i < 10; i++) 
    { 
        products.Add(new Products { Title = "Product " + i });
    }
    ViewBag.Products = products;
    return View();
}

View
<ul>
    @foreach (Products p in (ViewBag.Products as IEnumerable<Products>)) 
    {
        <li>@p.Title</li>
    }
</ul>

Ayrıca listeyi dynamic veri tipine çevirerekte kullanabiliriz. Bunu kullanmamızın amacı daha okunaklı bir kod içindir. Tabi intellisense özelliğinden yararlanamayız.
<ul>
    @foreach (dynamic p in ViewBag.Products) 
    {
        <li>@p.Title</li>
    }
</ul>

Böyle kullanınca temiz bir kod oluyor ama, otomatik sözdizim ve compile time (derleme zamanı) hata yakalamanın faydalarından yararlanamıyoruz.

Şimdi bu mantıkla devam edersek strongly-typed view kavramı karşımıza çıkıyor. ASP.NET MVC, aynı mantıkta modellerimizi Controller içerisindeki View döndüren fonksiyonların içerisinde parametre olarak gönderirsek, bu modeli gizli olarak viewData nesnesi içerisinde göndermektedir. Örnek üzerinde daha iyi anlaşılır bu;
public ActionResult List() 
{
    var products = new List<Products>();
    for (int i = 0; i < 10; i++) 
    {
        products.Add(new Products {Title = "Product " + i});
    }
    return View(products);
}

Sahne arkasında ViewData.Model nesnesine değer atanıyor. Daha sonra bu modelimizi View içerisinden @model anahtar kelimesini kullanarak çekebiliriz. Ek olarak modelimizin tipinide tanımlayabiliriz.
@model IEnumerable<MvcApplication1.Models.Products>
<ul>
    @foreach (Products p in Model) 
    {
        <li>@p.Title</li>
    }
</ul>

Gördüğünüz gibi yukarıda yaptığımız örnekleri view fonksiyonuna modeli parametre olarak göndererek yapmış olduk. Modeli kullanabilmek içinde @model kelimesi ile birlikte modelin yolu ve tipinide belirledik. Her defasında modelin yolunu belirtmemek için ~/Views/web.config içerisinde aşağıdaki gibi bir tanımlama yapabiliriz.
<system.web.webPages.razor>
    …
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
            <add namespace="MvcApplication1.Models" />
        </namespaces>
    </pages>
</system.web.webPages.razor>

MVC mimarisinin temel mantığı bu şekildedir. Nesnelerimizi Controller lar aracılığı ile View sayfalarına göndermek. View içerisinde bu verinin görüntülenmesini sağlamak.


2 yorum: