27 Nisan 2014 Pazar

Model'ler ve Veri ile Çalışmak

Merhaba arkadaşlar, geçen hafta View'lardan bahsettikten sonra bu hafta MVC'nin son katmanı olan Model'lerden bahsedeceğim.

Controller ve View'ları ele aldıktan sonra MVC'nin tanımını, MVC mimarisinin en önemli parçası olarak görülen Model'lerden bahsederek tamamlamanın vakti geldi. Model, MVC’de iş mantığının (business logic) oluşturulduğu bölümdür. İş mantığıyla beraber doğrulama (validation) ve veri erişim (data access) işlemleri de bu bölümde gerçekleştirilmektedir. Model nesneleri SQL Server gibi kalıcı bir depodaki veriye erişir ve iş mantığını uygular.

İş mantığı veri tabanı ile arayüz arasında aktarılan veri ile ilgilenir. Mesela bir stok sisteminde model, stoktaki ürünleri ve bir ürünün stokta olup olmadığını kontrol eder. Buna ek olarak model, depodan bir ürün satıldığında veri tabanını güncelleyen bir uygulamanın parçası olabilir.

Model ile Controller'ın Entegrasyonu

Model sınıflarını koymak için tavsiye edilen klasör Visual Studio tarafından sağlanan ASP.NET MVC uygulaması şablonundaki Models klasörüdür. Ancak başka projelerde de kullanmak için model sınıflarını ayrı bir assembly olarak koymak da mümkündür. Model sınıflarını controller'larda kullanmak; controller action'larında model nesnesini oluşturmak, model nesnelerinin metotlarını çağırmak ve view'larda göstermek için uygun veriyi bu nesnelerden çıkartmaktan ibarettir.

Aşağıdaki örnek bir kişiyi temsil eden basit bir model sınıfını göstermektedir:
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public int Zipcode { get; set; }
}
Model Bağlayıcıları

MVC'de bir model bağlayıcı, gönderilen form değerlerini bir .NET Framework tipine dönüştürmek ve bunu action metoduna bir parametre olarak koymak için kolay bir yoldur. Model bağlayıcıları tip dönüştürücü gibidirler, çünkü HTTP isteklerini action metotlarına parametre olarak yollanan nesnelere dönüştürebilirler.

Model bağlayıcılar IModelBinder arayüzünü tamamlayan bir sınıfın ilişkilendirilmesini sağlar. IModelBinder arayüzü, bir parametre veya türün değerini elde etmek için framework'ün çağırdığı GetValue metodunu içerir. DefaultModelBinder sınıfı IList, ICollection ve IDictionary sınıflarını da içeren birçok .NET Framework tipiyle çalışır.

Aşağıdaki örnek basit bir model bağlamanın nasıl yapıldığını göstermektedir. Bu örnekte kullanılan model yukarıda tanımladığımız Person sınıfıdır. Bu örnek bir PersonController sınıfı ve bir Index ve Details view'ını içermektedir. PersonController sınıfı Person nesnelerini tutması için bir liste oluşturur. Index view'ı, listedeki her Person nesnesinin Id ve Name özelliklerini göstermektedir. Details view'ı ise seçilmiş bir kişi ile ilgili bütün bilgileri göstermektedir.
PersonController sınıfı:
public class PersonController : Controller
{
    static List<person> people = new List<person>();

    //
    // GET: /Person/
    public ActionResult Index()
    {
        return View(people);
    }

    //
    // GET: /Person/Details/5
    public ActionResult Details(Person person)
    {
        return View(person);
    }
}
Index view'ı:
<h2>Index</h2>

<table>
    <tr>
        <th></th>
        <th>
            Id
        </th>
        <th>
            Name
        </th>
    </tr>

<% foreach (var person in Model) { %>

    <tr>
        <td>
            <%= Html.ActionLink("Details", "Details", person )%>
        </td>
        <td>
            <%= Html.Encode(person.Id) %>
        </td>
        <td>
            <%= Html.Encode(person.Name) %>
        </td>
    </tr>

<% } %>

</table>

<p>
    <%= Html.ActionLink("Create New", "Create") %>
</p>
Details view'ı:
<h2>Details</h2>

<fieldset>
    <legend>Fields</legend>
    <p>
        Id:
        <%= Html.Encode(Model.Id) %>
    </p>
    <p>
        Name:
        <%= Html.Encode(Model.Name) %>
    </p>
    <p>
        Age:
        <%= Html.Encode(Model.Age) %>
    </p>
    <p>
        Street:
        <%= Html.Encode(Model.Street) %>
    </p>
    <p>
        City:
        <%= Html.Encode(Model.City) %>
    </p>
    <p>
        State:
        <%= Html.Encode(Model.State) %>
    </p>
    <p>
        Zipcode:
        <%= Html.Encode(Model.Zipcode) %>
    </p>
</fieldset>
<p>
    <%=Html.ActionLink("Back to List", "Index") %>
</p>

Yukarıdaki kodlarda <%= Html.Encode(...) %> dikkatinizi çekmiştir. Bunlar ASP.NET MVC'deki "Helper" metotlarıdır. Adından da anlaşılacağı gibi HTML ile ilgili yardımcı metotlardır. Bu konuya ilerleyen haftalarda değineceğim.
Bu haftaki yazım burada sona eriyor, haftaya "Routing" yani "Yönlendirme" konusundan bahsedeceğim. Şimdilik hoşça kalın.

Kaynaklar:

0 yorum :