13 Şubat 2019 Çarşamba

Asp.net MVC Model Binding


Model Binding Nedir?

    MVC projelerinde View ile Controller arasında veri gönderme işlemlerine ve göndermiş olduğumuz verilerin Model yapısı ile eşleştirilmesi işlemine Model Binding adı verilmektedir. HTTP request ile gelen verilerinin ayrıştırılarak ilgili Controller’da bulunan Action metod parametrelerine ve uygun .NET tiplerine dönüştürülmesi işlemidir.

ASP.NET MVC Model Binding'ın Grafiksel Akışı

Model Binding, Http Requesti ilgili Controler'ün Action Metodu ve Model ile eşleme seçeneği sunar. View , Controller ve Model arasında bir aracı gibi çalışır. Grafiksel akışı aşağıdaki gibidir.

ASP.NET

Eğer bir Action metod parametre almışsa Model Binding işlemi gerçekleşmektedir.
Örneğin aşağıdaki gibi Index adında, string türünde bir tane parametre alan bir Action metod olsun.

  1. public ActionResult Index(string name)  
  2. {  
  3.     return View();  
  4. }  

Index Action’ı çağırılmadan önce arka plan işlemlerini yönetecek iki önemli bileşen vardır. Bunlar ValueProviderDictionary ve DefaultModelBinder’dır.
ValueProviderDictionaryHTTP request ile gelen parametreleri çekerek string halinde depolar. Bu işlem aşağıdaki sırayla gerçekleşir.
  • Request.Form[“name”] var mı diye bakar.
  • Yoksa RouteData.Values[“name”] var mı diye bakar.
  • Yoksa Request.QueryString[“name”] var mı diye bakar.
  • Yoksa null değer döndürür.
Böylece ValueProviderDictionary  HTTP request ile gelen değerleri elde etmiş olur.
DefaultModelBinder: ValueProviderDictionary sınıfının elde ettiği değerleri uygun .NET objelerine gönüştürme görevini üstlenir. Yukardaki örnekte “name” parametresi zaten string tipindedir. Bu durumda DefaultModelBinder dönüşüm yapmak durumunda değildir. Fakat aşağıdaki gibi int veya başka türde parametre alan Action metodlar olabilir.
  1. public ActionResult Index(int id,decimal rate)  
  2. {  
  3.     return View();  
  4. }  
Bu durumda da DefaultModelBinder sınıfı parametre tip dönüşümlerini otomatik olarak yapacaktır.
Şu ana kadar HTTP request ile gelen isteklerin ayrıştırılıp uygun .NET tiplerine dönüştürüldüğünü anlattım. Ancak bazen de aşağıdaki gibi bir objeyi modele bind etme durumu olabilir 
  1. public ActionResult Index(Insan insan)  
  2. {  
  3.     return View();  
  4. }  
DefaultModelBinder yukarıdaki gibi özel bir .NET tipi ile (Insan) karşılaştığında Reflection yardımına koşar. Reflection sayesinde özel tipe ait tüm public özellikler ValueProviderDictionary sınıfı tarafından sağlanan değerleri alır.


Model binding işlemini bir örnek ile incelemeye çalışalım. Örneğimizde bir Insan model nesnesinin nasıl bind edildiğini inceliyor olacağız.Aşağıdaki gibi Models Klasörünün içine  bir Insan nesnesi oluşturalım.
  1. public class Insan
  2. {
  3.   public int ID{get;set;}
  4.   public string FirstName{get;set;}
  5.   public string LastName{get;set;}
  6. }


Şimdi de Controller ekleyelim.Ekleme aşamaları aşağıdaki gibidir.

Add New Controller in ASP.NET MVC

Boş  Controllerı seçiyoruz.



İsim verelim.Default kısmına Home  yazalım ve Add diyelim oluşturalım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVC_BasicTutorials.Controllers
{
    public class HomeController : Controller
    {
        // GET: Insan
        public ActionResult Index()
        {
            return View();
        }
    }
}
Şimdide Controller deki Index e sağ tıklayarak Add View ile View ekleyelim.View tarafında bir form oluşturularak, oluşturulan formun Controller tarafında bir action metoda post edilmesi gerekmektedir.

View in başına aşağıdaki kodu ekleyelim.


@model MvcModelBinding.Models.Insan

Şimdide View in Body kısmına aşağıdaki kodları ekleyelim.
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Kişi Bİlgileri</legend>
   @Html.LabelFor(model => model.FirstName)       
            @Html.EditorFor(model => model.FirstName)
           @Html.ValidationMessageFor(model => model.FirstName)
            @Html.LabelFor(model => model.LastName)
            @Html.EditorFor(model => model.LastName)
            @Html.ValidationMessageFor(model => model.LastName)
            <input type="submit" value="Create" />
   </fieldset>
}
Controller tarafında ise DefaultModelBinder tarafından doldurulmuş Insan nesnesinin kullanılması gerekmektedir.


[HttpPost]
public ActionResult CreateInsan(Insan insan)
{
   // insan nesnesi form bilgileri ile doldurulmuş durumda
   // insan nesnesi artık gerekli işlem için 
   // (database, xml kaydı v.s) kullanılabilir
   return RedirectToAction("Index""Home");
}
Yukarıdaki action metodunun parametresi olan Insan nesnesi DefaultModelBiner tarafından doldurulmuştur.  @model MvcModelBinding.Models.Insan ile view sayfasının modelinin belirlendiğini görüyoruz. Controller tarafında CreateInsan metoduna post edilen form bilgileri Insan nesnesine doldurulmaktadır.
Bu işlem şöyle gerçekleşmektedir: DefaultModelBinder action metodun aldığı parametre tipinden (Insan) bir nesne oluşturarak Property’lerini view sayfasından gelen form bilgileri ile eşleştirerek doldurmaktadır.

Model Binding bu kadar bir sonraki yazıda görüşmek üzere.

Hiç yorum yok:

Yorum Gönder