Arkadaşlar Merhaba,

Bugün ASP.NET MVC’deki Model Binding mekanizmasını öğreneceğiz.

Model Binding: View’dan post ile gönderilen verilerin Controller’ımızda bulunan Action method parametrelerine dönüştürülme işlemidir. Eğer bir Action Methodumuz parametre almış ise ve bir post işlemi kendisine geliyorsa post işlemi ilk olarak Model Bindera düşer. Model Binder gelen bu posttaki verileri Bizim uygun olan modelimiz ile eşleştirme yapar. Böylece Controller’da view’dan gönderdiğimiz verilere erişim sağlayabiliriz. Eğer istersek default model binding mekanizmasi yerine kendi model binding mekanizmamızı yazabiliriz. Bu yazımın sonunda kendi model binding mekanizmamizi yazmayida göstereceğim.

Gelin şimdi örneklerimizle Model Binding mekanizmasını anlatmaya devam edelim.

public ActionResult Guncelle(){var Id = Request["ProductId"];return View();}

Öncelikle yukarıdaki resimde görüldüğü üzere burada bir model binding işlemi yapmıyoruz çünkü Guncelle methodumuz herhangi bir parametre almış durumda değil. Böyle bir durumda gönderilen değelere bir method yardımı ile erişiyoruz. Controller class’ının bize sağladığı Request ile post edilen verilere Action Methodumuz içerisinden erişim sağlayabiliyoruz. Request[“PropertyAdı”] şeklinde kullanarak hangi değere erişmek istediğimizi belirtiyoruz. Peki biz her zaman böyle Controllerımıza gönderdiğimiz verileri Request[“PropertyAdı”] diyerek mi erişmemiz gerekecek ? Tabikide hayır, bu işlem tam bir zaman kaybı her defasında farklı işlemler için aynı kod tekrarını yapmamız gerekecek. İşte tam burada MVC Model Binding devreye giriyor ve bizi bu zahmetten kurtarıyor arkadaşlar. Aşağıdaki örnekte Model Binding kullanımını görebilirsiniz.

[HttpPost]        public ActionResult RmaUpdate(int GelecekOlanId)        {	        var person = PersonList.PersonListesi.Where(t => t.ID == GelecekOlanId);	        return View(person);}

Post ile gönderilmiş olan GelecekOlanId adlı property’ye methodumuz içerisine parametre yazarak erişim sağlamış oluyoruz. Ancak unutulmaması gereken post ile gönderdiğimiz değişkenimizin name parametresine verdiğimiz değerin aynı şekilde method içerisinde aynı ismi karşılaması gerekir. Yani cshtml dosyanızdan bir veri göndereceğiniz zaman kullandığınız string türündeki ismi Controllerınızda aynı şekilde kullanmak zorundasınız aksi durumda controllerınızdaki değere Null değeri atanacaktır.

@using (Html.BeginForm("Index","Home",FormMethod.Post))        {            @Html.TextBox("TextKontrol") <br />            @Html.CheckBox("CheckBoxKontrol") @("Onayliyorum") <hr />            <input type="submit" value="Send" />        }

Burada HtmlHelper ile ekrana TextBoxt oluşturuyorum ve name attribute’una “TextKontrol” veriyorum. CheckBox ise farklı bir name attribute’una sahip. Eğer buradan gelecek değerleri yakalamak istersek buraya yazdığımız name attributelarını aynı şekilde Action methodumuz içerisinede yazmamız gerekmektedir.,

[HttpPost]public ActionResult Index(string TextKontrol, bool CheckBoxKontrol){// Gelen Değerleri istediğiniz işlemler doğrultusunda kullanabilirsiniz.return View();}

Görüldüğü üzere TextBox için Recep Mert ASLAN ismini girmiştim ve CheckBox’ın seçili durumda olmasını istemiştim.Burada Action içinde break point koyarak hangi değerlerin geldiğini yakalamış oldum. Eğer burada TextKontrol ismini GelecekOlanIsım veya herhangi bir isim olarak değiştirirseniz hata almazsınız ancak bu değişkeniniz null olarak atanır. Kendiniz test edip görebilirsiniz.

Hadi gelin daha karmaşık işlemlerde mesela bir classımıza gelen değerlerin eşleştirilmesi işlemini yapalım. Bunu Request methodu ile yapabiliriz ama gelin biz Model Binding mekanizmasını kullanarak zaman kaybının önüne geçelim.

Öncelikle Model klasörümüz altına Supplier adında bir class oluşturuyorum ve içerisindeki propertyleri oluşturuyorum.

public class Supplier	{		public int SupplierId { get; set; }		public string SupplierCompanyName { get; set; }		public string SupplierContactName { get; set; }		public string SupplierContactTitle { get; set; }	}

Ardından HomeController oluşturup içerisine dönüş tipleri ActionResult olan Index ve Update Methodlarimi oluşturuyorum. Index methodum için bir View oluşturuyorum ve ismini Index olarak bırakıyorum. İçerisine bir model alacağını söylüyorum ve bu modelin Supplier olacağını belirtiyorum. Ardından aşağıdaki kodları içerisine yazıyorum.

@using (Html.BeginForm("Update", "Home", FormMethod.Post))    {        <p>            @Html.Label("Supplier Name:")            @Html.TextBox("SupplierCompanyName")        </p>        <p>            @Html.Label("Supplier Contact Name:")            @Html.TextBox("SupplierContactName")        </p>        <p>            @Html.Label("Supplier Contact Title:")            @Html.TextBox("SupplierContactTitle")        </p>        <input type="submit" value="Save"/>    }

Burada Bir form oluşturdum ve bir post işlemi yapacağımı söyledim. Kullanıcının değerleri girebilmesi için gerekli textboxları oluşturdum ve bu form post olduğunda oluşturduğum Update adlı methoda gitmesini söyledim. Şimdi Update methodumuza gelelim ve buna Supplier türünde bir değişken tanımlayalım.Update methodumuz içerisine break point koyarak gelecek olan değerleri görelim. Index sayfamızı tarayıcımızda açalım ve textboxlarımızı doldurarak post işlemini başlatalım. Ardından program break point’e düşecektir. Aşağıdaki resimde gelen parametreleri görebilirsiniz.

[HttpPost]public ActionResult Update(Supplier supplier){return View();}

Model Binding görevini layıkı ile yaparak bizim yerimize supplier’a gerekli parametreleri atamış oldu.

Şimdi hoş güzel bizim yerimize Model Binding bu işlemleri yapıyor ama peki biz farklı şekilde doldurmak istiyorsak bu değeleri o zaman ne yapacağız ? İşte arkadaşlar yazımın başında bahsettiğim kısma geldik kendi Model Binder’ımızı yazacağız. Yeni bir klasör oluşturup ismini ModelBinders yapabilirsiniz. İçerisine MyModelBinder adında bir class ekliyorum. Bu class’ı IModelBinder interface’ınden implemente ediyorum. Yalnız burada dikkat edin IModelBinder derseniz iki tane aynı isimli Interface olduğunu göreceksiniz. Burada biz using’i System.Web.Mvc olan Interface’i implemente etmeliyiz. Sonra gelen BindModel isimli Methodun içerisini aşağıdaki gibi dolduralım. Burada ControllerContext içindeki HttpContext içerisinden Request‘lere erişebiliyoruz. Bu sayede gelen parametreleri kendimiz ayırarak ilgili değerlere set edip nasıl bir return type vereceğimizi belirtiyoruz. İşte burada biz kendi ModelBinder’ımızı yazmış oluyoruz arkadaşlar. Ben burada gelen ContactName ile TitleName’i birleştirip geri döndürmek istedim Siz istediğiniz şekilde geri dönüş parametreleri belirleyebilirsiniz.

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)	{		HttpRequestBase request = controllerContext.HttpContext.Request;		string contactName = request.Form["SupplierContactName"].ToString();		string titleName = request.Form["SupplierContactTitle"].ToString();		string companyName = request.Form["SupplierCompanyName"].ToString();		return new Supplier		{			SupplierContactName = contactName + " " + titleName,			SupplierCompanyName = companyName,			SupplierContactTitle = titleName		};	}

Ardından bu ModelBinder’ımızı kullanabilmemiz için son birkaç işlemimiz kaldı ilkini Global.asax içerisine bir satır kod yazarak tamamlıyoruz. Burada ModelBinder olarak Bizim kendi oluşturduğumuz bindir’ı kullanacağımızı belirtiyoruz.

protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            RouteConfig.RegisterRoutes(RouteTable.Routes);			// Just right here is enough			ModelBinders.Binders.Add(typeof(Supplier), new MyModelBinder());		}

İkincisini ise Bizim Update methodumuz vardı onun içerisine ModelBinder olarak hangi model binder’ı kullanacağımızı belirterek bu işlemi tamamlıyoruz. Kod bloğu aşağıdaki gibi olacaktir.

public ActionResult Update([ModelBinder(typeof(MyModelBinder))] Supplier supplier)	{		return View();	}

Görüldüğü üzere Recep Mert ASLAN’ın yanına bir MR. yazdırmış bulunmaktayiz. Umarım bu yazım sizler için faydalı olmuştur. Bu sadece basit bir örnekti Siz kendi Model Binder’ınızı istekleriniz doğrultusunda tasarlayarak daha farklı işler gerçekleştirebilirsiniz. Kendinize iyi bakın Koda bağımlı kalmayın diyorum arkadaşlar…