Asp.Net MVC JSON Model Bining

7 May

Asp.Net MVC mimarisinde yer alan model binding konusunu daha önceki yazılarda ele almıştık. Bu yazıda ise model binding işlemini JSON nesneleri ile uygylamaya çalışacağız. Web projelerinde ihtiyaç duyduğumuz  javascript tabanlı sorguları gerçekleştirmek için JSON nesnelerini .NET nesnelerine dönüştürmemiz gerekebilir. Request data olarak JSON nesnelerini POST edebilmeliyiz.

Örnek Uygulama

Örnek uygulama olarak bir ürün arama işlemini JSON formatındaki verileri bir Action metoda POST edeceğiz.

Öncelikli olarak Request ile gelen JSON fromatındaki veriyi deserialize ederek .Net nesnelerine dönüştürecek olan ModelBinder sınıfımızı oluşturmalıyız.

public class JsonModelBinder : IModelBinder
{
     public object BindModel(ControllerContext controllerContext,
                             ModelBindingContext bindingContext)
     {
          if (controllerContext == null)
             throw new ArgumentNullException("controllerContext");

          if (bindingContext == null)
             throw new ArgumentNullException("bindingContext");

          var serializer = new DataContractJsonSerializer(bindingContext.ModelType);
          var deSerialized = serializer.ReadObject(
                             controllerContext.HttpContext.Request.InputStream);

          return deSerialized;
    }

}

DataContractJsonSerializer sınıfının ReadObject metodu Request üzerinden ile gelen veriyi (InputStream), ModelBindingContext sınıfının ModelType parametresine göre uygun .Net tipine dönüştürür.

Şimdi de ModelBindingContext sınıfına gönderilecek olan tipi hazırlamalıyız.

[DataContract]
[ModelBinder(typeof(JsonModelBinder))]
public class JsonProductSearchRequest
{
     [DataMember]
     public string Name { get; set; }
     [DataMember]
     public string Color { get; set; }
}

System.Runtime.Serialization isim alanına dahil olan DataContract ve DataMember attribute tipleri sınıfları ve sınıf üyelerini serileştirilebilir hale getirmek için kullanılırlar. (Yeri gelmişken söylemekte fayda var; Bir tipi serileştirmek JSON, XML veya Binary şekillerde olabilmektedir. Biz örneğimizde JSON serileştirme üzerinde duracağız). JSonProductSearchRequest sınıfımızı, model binding sırasında ihtiyaç duyulan attribute olan ModelBinder ile imzalıyoruz, parametre olarak ise daha önceden hazırladığımız JsonModelBinder tipini gönderiyoruz.

Artık Controller tarafında ihtiyaç duyulan Action Metodları hazırlayabiliriz.

public class ProductController : Controller
{
   [HttpPost]
   public JsonResult JsonSearch(JsonProductSearchRequest request)
   {
       return null;
   }
}

JsonSearch Action metodu, daha önceden hazırladığımız JsonProductSearchRequest tipinde bir parametre almaktadır.

Şimdi hazırladığımız bu metoda fiddler yardımıyla bir istek (request) göndererek durumu incelemeye çalışalım.

Fiddler Json POST
Fiddler Json POST

Fiddler aracında Composer sekmesinden Request Tipini POST olarak seçiyoruz. Sunucudaki uygulama linkimizi girerek Request Body kısmına uygun JSON verisini giriyoruz. Execute butonuyla çalıştırdığımızda kodumuza geçip “break point” ile takip edersek:

Json Model Binder
Json Model Binder

Gönderdiğimiz verinin POST edildiğini rahatlıkla görebiliriz.

Bu şekilde etkili sonuç veren bir çözüme ModelBinding nimetlerinden faydalanarak ulaşmayı başardık. JSON tabanlı arama işlemlerini rahatlıkla bu şekilde gerçekleştirebiliriz. Ben bu örnekte View sayfalarıyla uğraşmamak adına fiddler aracından faydalanmayı uygun gördüm.

Bir sonraki yazıda görüşmek üzere.

Asp.net MVC 4 Yol Haritası

24 Ağu

Microsoft ASP.NET MVC 4 Yol haritasını yayınladı. Tabi bu yol haritası üzerinde değişklikler yapılabilmesi muhtemel geçici bir bakış açısı gibi duruyor. Bu yol haritasında dikkat çekici üç hazırlık mevcut. Bunlar yeni araçlar (tooling), genişletilmiş mobil platform desteği ve bulut tabanlı (cloud based) çözümler.

ASP.NET MVC takımındaki bir diğer çalışma ise Genişletilebilir Görev Tabanlı Araçlar (Recipes = (Extensible Task-Based Tooling). Örneğin view katamnında bir datagridi doldurup göstermek için önce data-access sınıfları hazırlanır, sonra controller tarafında veriler bir model doldurulur ve view katmanına sunulur. Bu çözümler (Recieps) denilen araçlar bu işlemlere yardım edecek. Kullanıcılar kendi çözümlerini de kendileri yazabilecekler. Yazılan çözümler bir arayüz vasıtası ile uygulamaya dahil edilebiliyor olacak.

Smartphone ve tablet tarafından olaya baktığımızda Microsoft ASP.NET MVC takımı template vb. yöntemlerle ASP.NET MVC 4 web sayfalarının mobil versiyonuna daha iyi destek vermeyi düşünüyor. Aşağıda MVC3 ve MVC4 ile yapılmış web sitelerinin mobil ortamda görüntülerini incelediğimizde farkı daha iyi anlamış olacağız.


Ele alınan bir başka değişiklik ise özellikle tablet ve mobil cihazlar için yeni bir proje şablonu. Bu şablonun da görünümü yine aşağıdaki gibi olacak:


Tabi bu kadarla da kalmayıp aygıta göre View oluşturma imkanı da gelen yeni yenilikler arasında. Örneğin mobil aygıtlar için oluşturulan bir View .mobile uzantılı olacak. Aşağıdaki resimde view katmanının görünümü verilmiştir: