ASP.NET MVC 3
05 Ocak 2011 Çarşamba
Tahmin ettiğiniz gibi MVC 3, ASP.NET MVC nin en son büyük sürümlerinden birisi.
ASP.NET MVC 3, MVC 2 sürümüyle uyumlu, böylece MVC 2 ile yazdığımız projeleri kolaylıkla MVC 3’e aktarabiliyoruz. Aynı zamanda, MVC 3’ün yeni özellikleri MVC 1 ve MVC 2’de yaptığımız temel işlemler ve aynı index mimarisi mevcut. Yani bu alanda sahip olduğunuz yetenekleriniz, bilgi birikiminiz; kullandığınız kütüphaneler, okuduğunuz kitaplar bunların hepsi MVC 3 için de size yardımcı olacak, kısacası ve uğraştırıcı bir teknolojiye merhaba demiyorsunuz. Sadece MVC 3 beraberinde eskilerinden farklı olarak bazı yeni özellikler ve özelleştirmeler getiriyor.
ASP.NET MVC 3 kurulumu MVC 2 sürümüyle beraber kurulabiliyor ve var olan "Preview 1" sürümünü de, var olan MVC 2 projelerinizi kaldırmadan sisteminize kurabiliyorsunuz. Projeleriniz hiçbir zarar görmüyor ve projenizin target’ını MVC 3 yapmadığınız sürece de var olan MVC 2 üzerinden çalışmaya devam ediyor. "Preview 1" i yüklediğinizde ASP.NET MVC 3 projeleri için Visual Studio 2010’un "New Project" ekranında çeşitli templateler göreceksiniz. Yeni bir proje oluştururken bunlardan herhangi birini seçmeniz, projenizin MVC 3 kullanması için yeterli olacaktır.
Aşağıda "Preview 1" sürümüyle ilgili bazı yeni özellikler ve özelleştirmelerin detaylarını inceleyebilirsiniz. Tabiki farklı sürümlerde daha da yeni özellikler eklenecektir ve onları da kullanabileceksinizdir.
View’lerdeki Yenilikler:
1) Add->View Ekranı:
"Preview 1" ile artık "Add->View" adında bir kısım geliyor. Bu özellike sayesinde, yeni bir view template oluşturduğunuzda bu template için kullanmak istediğiniz sentaksı seçmeniz çok daha kolaylaşıyor. Sisteminizde yüklü olan bütün view enginelerden sizin en uygun olanını seçebilmenize olanak sağlıyor:

Buradakilerden farklı olarak birçok açık-kaynaklı muhteşem View Template Engine’ler de mevcut (örneğin: Spark, NHaml, NDJango gibi) ve artık bunları Visual Studio’ya entegre etmek de çok kolay.
Şu andaki ASP.NET MVC 3 "Preview 1" kurulumu ise 2 tane View Engine default olarak sizlere sunuyor: ASPX ve Razor
2) Razor View Engine:
Razor View Engine bir örnek üzerinde incelemeye ne dersiniz? Şimdi ürün katagorilerini listeleyen ve siteye giren ziyaretçilerin katagorilere tıklayarak ürün listesini görebildiği çok basit bir mağaza sitesi kuralım:

Aşağıda bir StoreController class’ı var ve istediğimiz senaryoyu sağlamak için Index ve Browser Metodlarını gerçekleştiriyor:

StoreConroller’ımızın View Templateleri için Razor View Engine kullanacağız.
Aşağıda "Layout.cshtml" adında bir tasarım sayfası göreceksiniz. Bu sayfa sitemiz içerisinde genel layout UI tanımlar. RenderbOdy() metodumuz ise, bOdy kısmı içeriğinde tanımlanmış olan master layout dosyası temelli çalışan view templateleri belirtir:

Aşağıdaki resimde ise, Index işlemi için hazırladığımız view template’i göreceksiniz. Yukarıda oluşturduğumuz tasarım sayfasına bağlı çalışır ve katagori isimlerinin bir <ul> listesini verir:

Yukarıdaki template, StoreController’ımızın "Browse" işlemi için yönlendirme yapan bir hyperlink’i üretmek için ASP.NET MVC’nin standart Html.ActionLink() yardımcı metodunu kullanıyor. ASP.NET MVC çatısı altında bulunan bütün HTML yardımcı metodları (bayiler ve MvcContrib projeleri de dahil), Razor Viewler içerisinde çalışır.
Aşağıdaki resimde Browser işlemi için kullandığımız view template’i görebilirsiniz. Ürünleri belirli bir katagori içerisinde listeliyor:

Yukarıda, Controllerımızdan geçirdiğimiz ürünlerimizin listesine ulaşmak için, "Model" propertisini foreach ifadesini nasıl kullandığımızın dikkatini çekerim. Tıpkı .aspx view templatelerde yaptğımız gibi.. Bitmedi, Razor ayrıca view template geçirdiğimiz tanımlamamış "ViewData" ya erişmemizi sağlayan bir View propertisini de destekliyor. "View", bize ViewDataya ulaşırken daha net kullanılabilir bir sentaks sağlayan dinamik bir property’dir (dinamik propertyler .NeT 4.0 ile gelen bir özelliktir). ViewData["Category"] yazmaktansa, artık sadece Vİew.Category yazıyoruz.
3) Az ve Öz:
Yukarıdaki ekran görüntülerinde de gördüğünüz üzere Controllerımız ve Viewimizi gerçekleştirmek için yazdığımız her şey bu kadar. Razor net ve kısa view templateler oluşturmamızı sağlıyor ve kesintisiz(akıcı) kod yazmanıza yardımcı oluyor.
4) Kod Intellisense ve Renklendirme:
Screenlerde de göremediğiniz üzere, kod intellisense ve renklendirme desteği "Preview 1" sürümünde henüz mevcut değil. Sonraki sürümlerde bu konuda bir geliştirme çalışması yapılacak ve Visual Studio 2010 editörü, Razor dosyası tıpkı HTML/CSS/JavaScript’de olduğu gibi C# ve VB kodları için de intellisense destekli olacak.
5) İleride yapılacak geliştirmeler:
Bir sonraki sürümde sunacağımız, üzerinde çalışılan 3 yenilik mevcut:
- Temel class’tan belirgin olarak türetilenden ziyade, Razor dosyasının en üstündeki @model ifadesini kullanacabileceğiz. Böylece hem kod sayısı azalacak ve daha sadeleşmiş olacak.
- Her view template içerisine belirgin olarak siteyi yerleştirmekten sakınmak için, default bir LayoutPage tanımlayabileceğiz. Böylece view templateler arasındaki kodlar azalmış olacak ve kodlarımız daha netleşecek.
- Uygulamamızı çalıştırmaksızın veya Web-Serverımızı başlatmaksızın bireysel Razor template dosyalarımız için birim kontrolü yapabileceğiz.
Yukarıdaki ilk iki değişim ile Browse Template’imizi şu şekilde yazabileceğiz:

Yukarıdaki template sentaksı, full renklendirme ve kod intellisense ile gelecek sürümde destekleniyor olacak.
Controller Yenilikleri:
ASP.NET MVC 3 "Preview 1" birçok güzel controller-tanımlı yenilikler içeriyor.
1) Global Filterler:
ASP.NT MVC, filterler olarak bilinen mekanizmayı kullanarak "çapraz-kesim" mantığını uygulamamızı sağlıyor.

Geliştiriciler bir uygulama içerisindeki kontroller arasında sıklıkla birkaç filtreleme mantığını kullanmak isterler. Şimdi ASP.NET MVC 3, bir uygulama içerisindeki bütün kontrollere global olarak başvurması gereken bir filtreleyici tanımlamanızı sağlıyor. Bunu GlobalFilters collection içerisine ekleyerek gerçekleştirebiliyorsunuz. Ve artık bunu yapmak için gereken elverişli bir alanı sağlamak için, default Global.asax class template içerisinde bir RegisterGlobalFilters() metodu bulunuyor (ardından Application_Start() metoduyla çağrılıyor):

MVC 3’teki filter çözünürlük mantığı esnek. Böylece belirli durumlarla karşılaşılması halinde(örneğin debugging kullanılabilir olduğunda, veya bir istek belirli bir http verb kullandığında gibi), sadece şarta bağlı olarak başvurulan bir global filtreleyiciyi yapılandırabiliyorsunuz. Aynı zamanda, filterler artık bir Dependency Injection (DI) container’den çözülebiliyor.
2) Dinamik ViewModel Propertisi:
ASP.NET MVC Kontrolleri, bir API ile bir view template içerisine veriyi geçirmenizi sağlayan ViewData propertisini destekliyordu. Örneğin:

The "ViewData" API halen daha ASP.NET MVC 3 içerisinde destekleniyor. MVC 3 bunu artırıyor, her ne kadar dinamik tipte bir yapıya sahip olan Kontrol üzerindeki ve varolan API den daha temiz bir sentaks kullanan ViewData parçalarını geçmek için VB ve C# içerisinde yeni dinamik dil desteğini kullanmanızı sağlayan yeni bir "ViewModel" propertisi olsa dahi. Artık yukarıdaki aynı sonuca ulaşmak için aşağıdaki kodu alternatif olarak kullaanbilirsiniz:

ViewModel propertisini kullanmak için sağlam classlar tanımlamanıza gerek yok. Çünkü bu bir dinamik property, isterseniz bunun üzerinde get/set propertilerini kullanabilirsiniz ve bu runtime aşamasında dinamik olarak onları çözecektir. ViewData sözlüğü içerisine değerleri name/value çiftleri olarak depolayacaktır.
3) Yeni ActionResult Çeşitleri:
ASP.NET MVC 3 "Preview 1" çeşitli yeni ActionResult çeşitlerini ve yardımcı metodları beraberinde getiriyor.
-HttpNotFoundResult:
Bu yeni HttpNotFoundResult sınıfı ile o an cevap alınamayan URL’i talep eden kaynağı gösterebileceksiniz. Çağrılan client’a bir 404 HTTP durum kodu döndürür. Siz opsiyonel olarak bu yeni HttpNotFound() yardımcı metodunu, bu action result type’ın bir kimliğini göstermek için Controller üzerinde kullanabilirsiniz, aşağıdaki örnekte de gösterildiği üzere:

-Kalıcı Yönlendirmeler:
HttpRedirectResult sınıfı, kalıcı bir yönlendirmenin oluşup oluşmadığını gösteren yeni bir Boolean properti olan "Permanent" propertisine sahip. Kalıcı bir yönlendirme HTTP 301 durum kodunu kullanır. Bu değişimle bağantılı olarak, Controller sınıfı kalıcı yönlendirmeleri gerçekleştirmek için 3 yeni metoda sahip: RedirectPermanent(), RedirectToRoutePermanent() ve RedirectToActionPermanent(). Bu metodlar, Permanent propertisini true yaparak HttpRedirecrResult’ın kimliğini döndürürler.
HttpStatusCodeResult:
HttpStatusCodeResult sınıfı, belirli cevap durum kodlarını ve tanımlamalarını ayarlamalanızı sağlar.
JavaScript ve AJAX Geliştirmeleri:
ASP.NET MVC 3, JSON ile encode edilmiş verileri almanız için işlem metodlarını destekleyen JSON binding teknolojisine sahiptir.
Bu özelliği bir işlem içerisinde görmek için, aşağıdaki jQuery client-tabanlı bir Javascript ele alalım. client üzerinde save butonuna tıklandığında, save adında tanımlanan event handler çalıştırılmış olacaktır. Event handler içerisindeki kod, client-tabanlı bir JavaScript "product" nesnesi(ki bu HTML input elementlerinden çekilen 3 değerdir) kuracaktır. Ardından, server üzerindeki /Store/UpdateProduct URL’sine ürünü içeren JSON tabanlı bir isteği POST etmek için jQuery’nin .ajax() metodunu kullanır:

ASP.NET MVC 3 artık aşağıdaki bir işlem metodu kullanarak server üzerinde /Store/UpdateProduct URL’sini gerçekleştirmenize olanak tanır:

Yukarıdaki UpdateProduct() metodu sağlam yapılandırılmış bir Product nesnesini parametre olarak kabul eder. ASP.NET MVC 3, artık herhangi bir bağlama gerektirmeksizin server üzerinde bir .NeT Product tipine gelen JSON post değerlerini otomatik olarak bind edebilir. ASP.NET Şimdi, MVC’nin gömülü modeli ve input doğrulama özelliklerinin hepsi umduğunuz gibi güzelce çalışmakta. Client Templateler ve data binding ile ilgili geliştirilen bir senaryo ile de, Client templateler, client üzerinde çalışan templateleri kullanarak birçok veri parçalarını veya tek bir veri parçasını biçimlendirmenize ve göstermenize olanak sağlayacak. Ayrıca ASP.NET MVC 3, JSON verisini alan ve geri değer döndüren server üzerinde işlem metodları ile client tempatelerine kolaylıkla bağlanabilmenizi de sağlayacak.
Gelecekteki JavaScript/AJAX üzerine yapılacak geliştirmelerden bahsedersek: ASP.NET MVC 3 ün bir sonraki sürümünde, kendi içerisine gömülü doğrulama yardımcı metodlarıyla birlikte, kendi jQuery doğrulama kütüphanesi desteğine de direk olarak kullanabilmemiz mümkün olacak.
Model Doğrulama Geliştirmeleri:
ASP.NET MVC 2 kayda değer derecede bir model doğrulama geliştirmeleriyle karşımıza çıkmıştı. ASP.NT MVC 3 ile birlikte ise bu daha da genişletilmiş ve .NeT 4 içindeki System.ComponentModel.DataAnnotations isim uzayı içerisine çeşitli yeni özellikler de eklenmiştir. Özellikle:
-MVC 3, DisplayAttribute gibi .NeT 4 DataAnnotations metadata özniteliklerini desteklemektedir.
- MVC 3 Net in desteklediği ValidationAttribute sınıfını destekliyor. ValidationAttribute sınıfı da yeni bir IsValid aşırı yüklemesini desteklemek için geliştirilmiş vaziyette. Bunu kullanarak, o anki doğrulama içeriği hakkında daha fazla bilgi alınabiliyor(hangi nesne doğrulanıyor gibi).
-MVC 3, NeT 4 ile gelen yeni bir interface’i de destekliyor: IValidatableObject. Bu interface size, model-seviyeli doğrulama yapmanızı gerçekleştiriyor ve model içerisinde iki properti arasına veya modelin bütünüyle durumuna belirli doğrulama hata mesajlarını kullanabilmenizi sağlıyor.
Aşağıdaki örnekte, bir class üzerinde IValidatableObject kullanarak genel bir doğrulama metodu gerçekleştiriyoruz. Bu metod çoklu propertiler arasında doğrulama kurallarına başvurabiliyor ve çoklu doğrulama hatalarına uyum sağlayabiliyor (ve opsiyonel olarak aşağıdaki gibi bir hata mesajı verdirtebilrisiniz):

Ve sonuç aşağıdaki gibi gurulandırıcı:

ASP.NET MVC 3 aynı zamanda yeni bir IClientValidatable interface’ini bizlere tanıtıyor. Bunun ile, bir validatorun runtime aşamasında client doğrulaması desteği olup olmadığını öğrenmemizi sağlıyor.Bu interface çoktan tasarlandı ve çeşitli validation frameworklerle entegre edilebiliyor. Bitmedi: MVC 3 yeni bir interface’i daha tanıttı: IMetadataAware. Bu da sizin ModelMetadata oluşturma aşamasını nasıl kolaylaştırabileceğinizi basite indirgeyerek gerçekleştirir.
Kaynak: ASP.NET MVC 3 (Preview 1)
Etiketler :
MVC3 Yenilikler 
Kategoriler :
Programlama Asp.Net