Model Binding

Recep Mert ASLAN
Türkçe Yayın
Published in
5 min readJan 16, 2019

Arkadaşlar Merhaba,

https://cdn-images-1.medium.com/max/600/1*gi3R9gSdDRXZSjzGQb7EIw.png

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.

Ö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.

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.

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.,

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.

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.

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.

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.

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.

İ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.

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…

Facebook | Twitter | Instagram | Slack | Kodcular | Editör | Sponsor

--

--