17 Temmuz 2014 Perşembe

ASP.NET MVC Framework 5 Kullanarak IMDB Gibi Bir Film Sitesi Oluşturma (Controller Ekleme)

Önceki yazımızda örnek bir MVC Framework 4 template'ini ele alarak bir MVC uygulamasının içeriğinden bahsetmiştik. Bu yazımızda sıfırdan başlayarak bir sitenin nasıl oluşturulacağını göreceğiz.

Not: MVC 5 projesi oluşturalım dedik ama kendi sistemimde henüz Visual Studio 2012 olduğu için MVC Framework 5 desteği yok. Fakat küçük bir katakulli ile VS2013.1 yeteneklerini VS2012'de kullanabilmemiz mümkün. MSDN Blog 'dan öğrendiğim üzere VS2012 için VS2013.1 ASP.NET ve Web araçlarını buradan indirip kurarsak sorunumuz çözülecektir.

Uygun koşulları sağladıysak projemizi oluşturmaya geçebiliriz. File menüsünden New Project'i seçerek yeni proje oluşturuyoruz. Çıkan New Project ekranından soldaki menüden Visual C#'ı seçtikten sonra Web kısmına tıklayarak mevcut template'ler arasından Empty MVC 5 i seçiyoruz ve OK'a basıyoruz.



Sonra aynı önceki örneğimizdeki gibi varsayılan uygulamayı çalıştırmak için F5'e basıyoruz. Tarayıcı açılıyor fakat o da ne? Uygulamamız patlıyor.

 
Neden mi? Çünkü adı üzerinde bir Empty Project şablonu olduğu için henüz ne bir Controller ne de bir View oluşturduk.

Hatırlatma
Daha önce de öğrendiğimiz gibi MVC, iyi bir mimariye sahip, test edilebilir ve kolayca bakımı yapılabilir uygulamalar oluşturmak üzere tasarlanmış bir şablondur. MVC temelli uygulamalarda:
  • Model: Uygulamanın verilerini temsil eden ve bu veriler için ticari kuralların uygulanmasını sağlayan doğrulama mantığının (validation logic) bulunduğu sınıflardır.
  • View: Kullanıcıya sunulan HTML sayfalarını dinamik bir şekilde oluşturan şablon dosyalarıdır.
  • Controller: Gelen tarayıcı isteklerini işleyen, model verisini getiren ve tarayıcıya cevap olarak döndürülecek uygun view'ı seçen sınıflardır.
Bu yazıda bu üç elemanı daha çok ele alacağız ve bir uygulama oluştururken bu elemanları nasıl kullanacağımızı göreceğiz.


Öncelikle controller sınıfımızı oluşturarak işe başlayalım. Solution Explorer'daki Controllers klasörüne sağ tıklayıp Add, ve Controller'ı seçelim.



Add Scaffold diyaloğunda MVC 5 Controller - Empty'i seçelim ve Add'e tıklayalım.


Yeni controller'ımızın adını MerhabaDunyaController koyalım ve Add'e tıklayalım


Solution Explorer'a baktığımızda MerhabaDunyaController.cs dosyasını ve Views dizini altında yeni bir MerhabaDunya dizini görüyoruz. Bu aslında tam da aradığımız şey. /MerhabaDunya uzantılı bir istek geldiğinde bunu MerhabaDunyaController'ımız karşılayacak ve /Views/MerhabaDunya dizininden ilgili view'ı bulup gösterecek. Fakat /Views/MerhabaDunya/ dizini altında henüz böyle bir view oluşturmadık. Bu nedenle kodu çalıştırdığımızda hata verecektir. Şimdilik kodu şu şekilde değiştirelim:
using System.Web;
using System.Web.Mvc; 
 
namespace MvcMovie.Controllers 
{ 
    public class MerhabaDunyaController : Controller 
    { 
        // 
        // GET: /MerhabaDunya/ 
 
        public string Index() 
        { 
            return "Bu <b>varsayılan</b> bir action'dır..."; 
        } 
 
        // 
        // GET: /MerhabaDunya/Hosgeldiniz/  

        public string Hosgeldiniz() 
        { 
            return "Bu Hoşgeldiniz eyleminin metodudur..."; 
        } 
    } 
}
Yaptığımız değişikliklerle artık Controller'ımızın metodları HTML kodları geri döndürür hale geldi. Şimdi uygulamamızı gönül rahatlığıyla çalıştırabiliriz. F5'e basıp tarayıcımız açıldığında URL'in sonuna /MerhabaDunya ekleyelim ve mevcut URL'e gidelim. Tarayıcımızdaki sayfa tam da bizim istediğimiz gibi görüntülendi:



ASP.NET MVC, URL'e göre farklı controller sınıflarında bulunan farklı action metodlarını çalıştırır. MVC uygulamasında hangi kodun çalıştırılacağına dair varsayılan URL formatı şu şekildedir.
/[Controller]/[ActionName]/[Parameters]

App_Start/RouteConfig.cs dosyasında değişiklikler yaparak bu formatı değiştirebiliriz. Varsayılan olarak "HomeController" atanmış görünüyor. Bizde böyle bir controller bulunmadığı için  gelin bunu MerhabaDunyaController'ın kullanılacağı şekilde "MerhabaDunya" olarak değiştirelim:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "MerhabaDunya", action = "Index", id = UrlParameter.Optional }
    );
}

Uygulamayı çalıştırdığımızda artık varsayılan olarak MerhabaDunyaController'daki Index metodu döndüğü için /MerhabaDunya kısmını URL'e eklemesek bile hata almıyoruz.

RouteConfig.cs
dosyasındaki aşağıdaki satırı inceleyelim.
url: "{controller}/{action}/{id}"
  • Burada URL'in ilk parçası, hangi controller sınıfının seçileceğini belirtiyor. Bu nedenle URL'de girdiğimiz /MerhabaDunya kısmı MerhabaDunyaController sınıfına tekabül eder.
  • URL'in ikinci parçası ise belirlenen controller sınıfındaki hangi action metodunun çalıştırılacağını söylüyor. Bu yüzden /MerhabaDunya/Index kısmı, HelloWorldController sınıfının Index metodunun çalıştıracağını bildirir. Farkedersek URL kısmına sadece /MerhabaDunya ekledik ve Index metodu varsayılan olarak çalıştı. Çünkü açık bir şekilde bir URL belirtmezsek varsayılan olarak Index metodu çalıştırılır.
  • URL'in üçüncü parçası ise yönlendirme verisi üzerinde değişiklikler yapmak için kullanılır. Bu kısma biraz sonra detaylı bir şekilde değineceğiz.

http://localhost:xxxx/MerhabaDunya/Hosgeldiniz'e gidersek, controller'ımızın içinde bulunan Hosgeldiniz metodunun çalıştığını ve "Bu hoşgeldiniz eyleminin metodudur..." mesajını geri döndürdüğünü görebiliriz. Fakat dikkat edersek şu ana kadar Parameters kısmını hiç kullanmadık. Biraz da ona bakalım.

Not: URL ile parametre geçirme işlemi, URL'de verilen action metodundan sonra ? karakteri (ki bu sorgu karakterimiz oluyor) koyarak parametre adı ile birlikte ilgili değerleri aktarabiliriz.

Örnek: MerhabaDunya/Hosgeldiniz?isim=Zafer&sayi=2

Hosgeldiniz metodu içerisine aşağıdaki gibi iki tane parametre ekleyelim. Dikkat edersek sayi parametresinde, C#'daki seçimli parametre özelliği kullanılmış. Yani hiç parametre değeri geçirmezsek varsayılan olarak 1 atanacaktır.
public string Hosgeldiniz(string isim, int sayi = 1) {
     return HttpUtility.HtmlEncode("Merhaba " + isim + ", sayı= " + sayi);
}
Uygulamayı çalıştırıp örnek URL'i (http://localhost:xxxx/MerhabaDunya/Hosgeldiniz?isim=Zafer&sayi=2) girelim. URL'deki isim ve sayi parametreleri için farklı değerler girmeyi deneyebiliriz. ASP.NET MVC Model Binding System otomatik olarak URL'deki parametreler ile metodumuzdaki parametreleri eşleştirecektir.


Yukarıdaki örnekte URL formatında bulunan [Parametrs] kısmını kullanmadık, sadece isim ve sayi parametreleri sorgu kelimeleri olarak aktardık.

URL'deki soru işareti (?), devamında gelen sorgu kelimeleri ile önceki URL'i ayıran bir ayıraç gibi davranır. & karakteri ise sorgu kelimelerinin birbiri arasında ayrılmasını sağlar. Hosgeldiniz metodunu, [Parametrs] kısmını kullanmak için aşağıdaki şekilde değiştirelim:

public string Hosgeldiniz(string isim, int ID = 1) {
     return HttpUtility.HtmlEncode("Merhaba " + isim + ", ID: " + ID);
}
Uygulamayı tekrar çalıştıralım ve URL'in sonuna şunu ekleyelim :
  • /MerhabaDunya/Hosgeldiniz/2?isim=Zafer

Bu kez üçüncü URL kısmı, ID yönlendirme parametresi ile eşleştirilmiş oldu. RegisterRoutes metodu içerisindeki formatlamaya göre Hosgeldiniz metodunun bir ID parametresi olduğunu söyleyebiliriz.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
ASP.NET MVC uygulamalarında parametrelerin, sorgu kelimeleri yerine, yönlendirme verileri şeklinde (ID'de olduğu gibi) gönderimi daha yaygındır. Ayrıca isim ve sayi parametrelerinin URL içerisinde yönlendirme verisi olarak geçirilmesi için ayrı bir route (yönlendirme, rota) ekleyebiliriz. App_Start dizini altındaki RouteConfig.cs dosyasını açıp Merhaba rotasını ekleyelim:

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

      routes.MapRoute(
           name: "Merhaba",
           url: "{controller}/{action}/{isim}/{id}"
       );
   }
}
Uygulamayı çalıştıralım ve URL'e şunu ekleyelim:

  • /MerhabaDunya/Hosgeldiniz/Zafer/2


Birçok MVC uygulamasında için genelde varsayılan rotayı kullanmak yeterlidir. Sonraki yazımızda model binder kullanarak verileri geçirmeyi göreceğiz. Böylelikle RouteConfig içerisine girip varsayılan rotayı değiştirmek zorunda kalmayacağız.

Bu yazımızda oluşturduğumuz controller, MVC'nin VC (view ve controller) kısmını tek başına yaptı ve HTML kodlarını direkt olarak döndürdü. Normalde controller'ların HTML kodlarını direkt olarak döndürmesini istemeyiz. Çünkü bu, controller sınıfını oldukça hantal bir hale getirir. Bunun yerine HTML cevaplarını döndürmek için ayrı bir view oluşturacağız. Sonraki yazımızda bunun nasıl gerçekleştiğini göreceğiz.


Kaynaklar: ASP.NET







15 Temmuz 2014 Salı

Model, View, Controller Yapılarına Detaylı Bakış

Önceki yazımızda ASP.NET MVC yapısının ne olduğundan ve avantajlarından bahsetmiştik. Bu yazıda ise daha derinlere inerek MVC'deki Model-View-Controller isimli üç silahşörlerin tüm özelliklerinden bahsedeceğiz.

Bu yazıyı okuduktan sonra, bir MVC uygulamasının farklı bölümlerinin nasıl birlikte çalıştığını öğrenmiş olacağız. Ayrıca bir MVC uygulamasının mimarisinin nasıl Web Forms uygulamasından farklı olduğunu göreceğiz.

Örnek bir ASP.NET MVC Uygulaması

Visual Studio'da bulunan ASP.NET MVC Web Uygulamaları oluşturmak için varsayılan şablon, oldukça basit bir örnek uygulama içerir. Bu örnek uygulamayı, bir MVC uygulamasının çeşitli bölümlerini kolayca kavrayabilmek için kullanabiliriz. Yazımızda da zaten bu örneği kullanacağız.


Visual Studio 2012'yi çalıştırdıktan sonra üst menüdeki File sekmesinden New Project'i seçerek bir ASP.NET MVC uygulaması oluşturabiliriz. New Project kutucuğundan Visual C#'ı seçerek altında kalan proje türlerinden ASP.NET MVC 4 Web Application'ı seçelim. Sonrasında OK'a tıklayalım.


Bir ASP.NET MVC uygulaması oluşturduğumuzda MVC şablonlarından birini kullanın diye öntanımlı olarak sorar. Burada sunucu olarak kendi bilgisayarımızı kullanmamız için hem de kolaylık açısından Intranet (Internet değil) Apllication'ı seçelim ve OK'a tıklayalım.


ASP.NET MVC uygulaması oluşturulduktan sonra bizi bir Readme dosyası karşılıyor. Solution Explorer penceresine baktığımızda ise birçok dosya ve dizin görüyoruz. Özellikle de Models, Views ve Controllers ismindeki 3 dizin gözümüze çarpıyor. Adından da anlaşılacağı gibi bu dizinler Model-View-Controller yapısını implement etmek için var.


Eğer Solution Explorer penceresinden Controllers dizinini genişlettiğimiz zaman HomeController.cs dosyasının bulunduğunu görüyoruz. View dizinini genişletttiğimiz taktirde de ortaya Home ve Shared isimli iki altdizinin çıktığını görüyoruz. Home dizinin altında About.cshtml, Contact.cshtml ve Index.cshtml isminde iki ek dosya görebilmemiz mümkün. Bu dosyalar, varsayılan ASP.NET MVC şablonunda bulunan örnek uygulamayı oluşturuyorlar.

Not: .cshtml uzantılı dosyaların .aspx'lerden aslında çok büyük bir farkı yok. ASP.NET inline kodları gibi Razor kodları da geçici ara koda dönüştürülüyor. Razor View Engine'deki syntax yapısının daha kolay olduğu için böyle bir uygulamaya gidilmiş. Razor kodlarında sadece @ işareti kullanarak kolayca C# kodları gömebilmek mümkün.
Human nesnesinden Name özelliğini okuyacağımızı düşünelim:
Inline syntax:  <div>Name is <%=Human.Name %></div>
Razor syntax: <div>Name is @Model.Name</div>

Gördüğümüz gibi Razor syntax ile daha kolay bir şekilde Name özelliğini okumuş olduk.


Debug menüsünden Start Debugging'i seçererk örnek uygulamayı çalıştırabilmemiz mümkün. Buna alternatif olarak F5'e de basabiliriz.

Visual Studio otomatik olarak uygulamamızı tarayıcımızda çalıştırılıyor. Ve uygulamamızın patladığını görüyoruz :)


Burada Access is denied (erişim engellendi) hatasını almamızın sebebi aslında Microsoft'un MVC uygulamaları korumak için varsayılan olarak getirdiği bir güvenlik önlemi.






Visual Studio'ya gelip Stop Debugging yaptıktan sonra Solution Explorer'da Web.config dosyası içerisinde 23.satırdaki <deny users="?" /> etiketini yorum satırı haline getirerek bunu çözebiliriz. Şimdi tekrar uygulamamızı başlatabilriz.


 Örnek uygulamamız Index, About ve Contact olmak üzere üç web sayfası içeriyor. About sayfasına gitmek için üstteki About linkine tıklayabiliriz.

Adres çubuğuna bakarsak /Home/About ve /Home/Contact olarak değiştiğini görebiliriz.

Tarayıcıyı kapatıp Visual Studio'ya döndüğümüzde Home/About gibi bir path göremiyoruz. Peki dosya nereye gitti havalanıp uçmadı ya? Böyle bir şeyin olması mümkün olabilir mi?

MVC Uygulamasında URL İle Sayfa Birbirine Eşit Değildir

Bir ASP.NET Web Forms uygulaması oluşturduğumuzda URL ve sayfanın bire-bir eşleştiğini görürüz. Mesela sunucudan Sayfam.aspx isimli bir web sayfası istersek, diskten de Sayfam.aspx isimli sayfanın gelmesini bekleriz. Eğer böyle bir sayfa mevcut değilse 404 - Sayfa Bulunamadı hatasını alırız.

Web Forms'un aksine MVC uygulamasında, tarayıcıdaki adres çubuğuna yazdığımız URL ile uygulamamızdaki dosyalar arasında böyle bir benzeşme yoktur. MVC uygulamasında bir URL, diskteki sayfa yerine controller'daki action ile eşleşir.

ASP.NET uygulamasında, tarayıcı istekleri sayfalar ile eşleştirilir. MVC uygulamasında ise tarayıcı isteklerine cevap veren controller eylemleri (actions) vardır. Web Forms uygulamaları içerik odaklıdır. MVC uygulamaları ise uygulama mantığı (application logic) üzerine odaklıdır.

ASP.NET Routing

ASP.NET Framework'teki gelen tarayıcı isteklerinin bir controller eylemine eşleştirilmesine ASP.NET Routing denir. MVC Framework, gelen istekleri controller eylemlerine yönlendirmek için ASP Routing kullanır.

ASP.NET Routing, gelen istekleri işleyebilmek için bir yönlendirme tablosu (routing table) kullanır. Bu yönlendirme tablosu, web uygulamamızı ilk kez başlattığımızda oluşturulur. Yönlendirme tablosu, Solution Explorer'da yer alan Global.asax dosyasında oluşturulur.


ASP.NET uygulaması ilk kez başlatıldığında Application_Start() metodu çalıştırılır. Bu metod RegisterRoutes() metodunu çalıştırır ve RegisterRoutes() metodu varsayılan yönlendirme tablosunu oluşturur.

Varsayılan yönlendirme tablosunda tek bir tane yönlendirme bulunur. Bu yönlendirme, gelen istekleri 3 parçaya ayrıştırır:
  1. İlk parça bir controller ismi ile eşleştirilir.
  2. İkinci parça action adı ile eşleştirilir.
  3. Son parça da belirlenen action'ın id parametresi ile eşleştirilir
Örneğin şöyle bir URL'imiz olsun: /Ürün/Detaylar/3
Bu URL aşağıdaki şekilde üç parametreye ayrıştırılır:

  • Controller = Ürün
  • Action = Detaylar
  • Id = 3
Global.asax dosyasında tanımlanan varsayılan yönlendirmede 3 tane ön tanımlı parametre değeri vardır:

  • Controller Home'dur
  • Action Index'tir
  • Id ise boş bir string'dir.

Bu üçünü göze alarak, aşağıdaki URL'in nasıl ayrıştırılacağına daha yakından bakalım:
URL: /Employee

  • Controller = Employee
  • Action = Index
  • Id = ��

Bir de herhangi bir URL girmeden bir MVC Uygulaması açarsanız, URL varsayılan olarak şu şekilde ayrıştırılacaktır:

  • Controller = Home
  • Action = Index
  • Id =��


Controlller'lar Nedir?

MVC Uygulaması ile kullanıcı etkileşimin kontrolünden bir controller sorumludur. Bu controller, MVC Uygulamasındaki akış kontrolü mantığını (flow control logic) içerir. Kullanıcı tarayıcıdan bir istek oluşturduğunda, kullanıcıya neyin geri döneceğini bir controller belirler.

Bir controller, C# veya VB dilinde yazılan bildiğimiz sınıftır. Örnek MVC uygulamamız Controllers dizini altında HomeController.cs isimli controller'ı içerir. Hadi bu controller'a daha yakından bakalım.

Sınıfa baktığımızda Index(), About() ve Contact isimli üç metod görüyoruz. Bu üç metod, controller tarafından sunulan üç tane eyleme cevap vermek üzere hazırlanmıştır. Controller'a /Home/Index isimli bir URL geldiğinde HomeController.Index() metodu, /Home/About URL'i geldiğinde HomeController.About() metodu çalıştırılır.

Bir contolller'daki her bir public metod, bir controller eylemine (action) tekabül eder. Bu konuda dikkatli olmalıyız. Çünkü, tarayıcı üzerinden URL'i doğru şekilde giren herhangi bir kimse controller içerisindeki public metoda erişip çalıştırabilir.

View'lar Nedir?

HomeController sınıfının Index(), About() ve Contact() isminde üç tane metod sunduğundan daha önce bahsetmiştik. Bu metodların üçü de birer view döndürüyor. Bir view'da HTML kodları ve tarayıcıya iletilecek içerik bulunur. MVC uygulamasında bir view, bir web sayfasıyla eş değerdir.

View'ları doğru konumda oluşturmalıyız. Mesela HomeController.Index() eylemi aşağıdaki konumdaki bir view'ı return eder:
\Views\Home\Index.cshtml

HomeController.About() eylemi ise aşağıdaki URL'de bulunan bir view'ı geri döndürür:
\Views\Home\About.cshtml

Bir controller eylemi için bir view döndürmek istiyorsak, Views dizini altında o controller ile aynı isimde bir alt dizin oluşturmamız gerekir. Alt dizin içerisinde de, controller eylemi ile aynı isimde bir .cshtml dosyası oluşturmak zorundayız.


Solution Explorer'daki About.cshtml dosyasına yakından bakalım. @'li satırlar haricinde, view'ın geri kalanı standart bir HTML yapısında görünüyor. Bu sayede view içeriğindeki HTML kodlarını değiştirebilmemiz mümkün.

Bir view, Web Forms'daki bir sayfaya oldukça benzer. Bir view sadece HTML değil aynı zamanda script'leri de içerebilir. C# veya VB ile scriptleri yazarak, veritabanı gibi dinamik içerikleri görüntüleyebilmemiz mümkün.

Model'lar nedir?

Controller'lardan ve view'lardan bahsetmiştik. Son konumuz ise model'lar ile alakalı. Peki bir MVC uygulamasındaki model nedir?

Bir MVC model, controller veya view'da bulunmayan tüm uygulama mantığını (application logic) içerir. Bu sebeple Model; business, validation ve database logic'ini içermelidir. Örneğin veritabanına bağlanmak için Entity Framework kulanıyorsak, Models dizini altında Entity Framework sınıflarını (.edmx dosyasını) oluşturmamız gerekir.

Bir view yalnızca ve sadece kullanıcı arayüzü oluşturma ile alakalı işleri içermelidir. Bir controller da kullanıcıya doğru view'ı return edecek kısmı içermelidir. Geriye kalan herşey model içerisinde yer alır.

Genelde büyük model'lar ve küçük controller sınıfları ile uğraşmalıyız. Controller'ımızda sadece birkaç satır kod bulunmalıdır. Eğer bir controller eylemi kodlarla şişerse, bir kısım kodları Models dizinindeki yeni bir sınıfa taşımayı düşünebiliriz.

Özet Olarak

Bu yazımızda ASP.NET MVC web uygulamasının çeşitli bölümlerini ele aldık. ASP.NET Routing'in, gelen tarayıcı isteklerini nasıl belirli controller eylemlerine eşleştirdiğini öğrendik. Controller'ların da nasıl view'ları yönettiğini gördük. Son olarak da model'ların, uygulamanın business, validation ve database erişim mantığını nasıl içerdiğini öğrendik.

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

Kaynaklar: ASP.NET, Stackoverflow.com

14 Temmuz 2014 Pazartesi

Bir ASP.NET MVC Web Uygulamasının Çalışma Süreci

Bir ASP.NET MVC Web uygulamasına gelen istekler, öncelikle bir HTTP modülü olan UrlRoutingModule nesnesine iletilirler. Bu modül, gelen isteği parse eder ve rota seçimini gerçekleştirir. UrlRoutineModule nesnesi mevcut istekle eşleşen ilk rota nesnesini seçer (Buradaki rota objesi, RouteBase sınıfını implement eder ve bir Route sınıfının instance'ıdır.). Eğer hiçbir rota eşleşmiyorsa, UrlRoutingModule nesnesi hiçbir şey yapmaz ve gelen isteğin ASP.NET veya IIS istek işleyicisine gitmesine izin verir.


UrlRoutingModule nesnesi, seçilen Route nesnesini kullanarak Route nesnesi ile ilişkili IRouteHandler nesnesini elde eder. Genellikle bu nesne, MvcRouteHandler sınıfının bir instance'ıdır. IRouteHandler instance'ı, IHttpHandler nesnesini oluşturur ve bunu IHttpContext nesnesine iletir. Varsayılan olarak IHttpHandler instance'ı, MVCHandler nesnesidir. MvcHandler nesnesi devamında isteği işleyecek uygun controller'ı seçer.

Not: Bir MVC Web uygulaması IIS 7.0 altında çalışıyorsa, MVC projeleri için dosya isim uzantısına ihtiyaç yoktur. Şayet IIS 6.0'daki handler, .mvc dosya ismi uzantısını ASP.NET ISAPI DLL'i ile eşleştirmenizi gerektirir.

Modül ve handler, MVC framework'ü için bir sınır kapısı niteliğindedirler. Aşağıdaki eylemleri gerçekleştirirler:
  • Bir MVC Web uygulamasında uygun controller'ı seçerler,
  • Mevcut controller'ın instance'ını elde ederler,
  • Controller'ın Execute metodunu çalıştırırlar.

Aşağıdaki tabloda bir MVC Web projesinin çalıştırma adımları listelenmiştir.

Aşamanın adı Aşama ile ilgili ayrıntılar
Uygulama için ilk isteğin alınması Global.asax dosyasındaki Route nesneleri RouteTable nesnesine eklenmiştir.
Yönlendirmenin gerçekleştirilmesi UrlRoutingModule modülü, RouteTable collection'ı içerisindeki ilk eşleşen Route nesnesini kullanarak RouteData nesnesini oluşturur. RouteData nesnesi devamında RequestContext (IHttpContext) nesnesini yaratmak için kullanılır.
MVC request handler'ının oluşturulması MvcRouteHandler nesnesi, MvcHandler sınıfının bir instance'ını oluşturur ve RequestContext instance'ına iletir.
Controller'ın oluşturulması MvcHandler nesnesi, controller nesnesini kullanarak IControllerFactory nesnesini tanımlamak için RequestContext instance'ını kullanır.
Controller'ın çalıştırılması MvcHandler nesnesi, controller'ın Execute metodunu çalıştırır.
Eylemin başlatılması Controller'lar, Controller sınıfından türetilmişlerdir. Bu yüzden controller'ların bu eylemi gerçekleştirebilmesi için, ilgili controller ile ilişkili ControllerActionInvoker nesnesi, controller sınıfının hangi eylem metodunun çalıştırılacağına karar verir, ve sonra da o metodu çalıştırır.
Sonucun yürütülmesi Genellikle bir eylem metodu kullanıcı girdisini alabilir, uygun cevap verisini hazırlayabilir, ve devamında sonuç türünden geriye dönen sonucu çalıştırabilir. Dahili sonuç türleri aşağıdakileri içerecek şekilde çalıştırılabilir: ViewResult (bir view'ı işleyen ve en çok kullanılan result türüdür), RedirectToRouteResult, RedirectResult, ContentResult, JsonResult, ve EmptyResult.

Daha fazla bilgi için: lennybacon.com
Kaynaklar: ASP.NET

13 Temmuz 2014 Pazar

ASP.NET MVC Framework'üne Giriş

 Merhabalar. Bu yazımda sizlere Microsoft'un geliştiricilere taa 2009 tarihinde sunduğu fakat birçok kişinin Web Forms kullanmaya alıştığı için yeni bir teknolojiye alışmaktan çekindiği, zaman ayırmak istemediği için çalıştırmaya geçiştirdiği  MVC Framework'ünden kısa bir şekilde bahsedeceğim.

MVC denince akla ne kadar ASP.NET gelse de aslında 1970'lerde Smalltalk-76 içerisinde tanıtılmıştır. MVC (Model-View-Controller) bir uygulamayı 3 ana bileşene (model, view, controller) ayıran mimarisel bir şablondur. ASP.NET MVC framework'ü, MVC şablonunu temel alan Web uygulamaları oluşturmak için ASP.NET Web Forms modeline bir alternatif olarak ortaya çıkmıştır. Hafif (lightweight) ve test edilebilirliği yüksek olan ASP.NET MVC framework'ü, master sayfaları ve üyelik temelli kimlik doğrulama sistemi gibi mevcut ASP.NET özellikleri ile bütünleşmiştir. MVC framework'ü System.Web.Mvc namespace'inde tanımlanmıştır ve Sytem.Web'in temel ve destekleyici bir elemanıdır.

MVC framework aşağıdaki bileşenleri içerir:



  • Model: Data logic kısmı burada ele alınır. Model nesneleri genellikle veritabanındaki bir modeli SELECT edip getiriler veya INSERT INTO şeklinde depolarlar. Örneğin bir Ürün nesnesi, veritabanından ilgili ürün bilgisini getirebilir, işleyebilir, ve güncellenen bilgiyi tekrar Ürünler tablosuna yazabilir.
  • View: Uygulamadaki kullanıcı arayüzünü (UI) görüntüleyen bileşenlerdir. Genellikle bu bileşenler UI model verilerinden yaratılır. Önceki örneğimizdeki Ürünler tablosunun güncelleme ekranını örnek olarak verebiliriz. Bu ekranda, o anki Ürün nesnesini temel alan Textbox'lar, Drop-down list'ler, Checkbox'lar bulunur.
  • Controller: Kullanıcı etkileşimlerini alıp model ile birlikte çalışan ve sonunda bu verileri görüntüleyecek view'ı seçen elemanlardır. Bir MVC uygulamasında view sadece bilgileri görüntülemeli, controller ise kullanıcı girdilerini alıp ve ona göre kullanıcıya bir cevap döndürmelidir. Örneğin  bir controller, sorgu kelimelerini alır ve bu değerleri modele ileterek veritabanında sorgu işlemlerinin gerçekleştirilmesine ön ayak olur.


MVC şablonu, uygulamanın farklı katmanlarını (input, business ve UI logic) birbirinden ayırarak uygulamalar oluşturmanıza olanak tanır. Bu şablon hangi tür katmanın, uygulama içerisinde nerede duracağını belirler. Örneğin UI katmanı view'a, businnes katmanı ise model'a aittir. Böyle bir ayrımın sağlanması ile bir uygulama oluşturulurken oluşan karmaşıklığın azaltılması sağlanır. Çünkü belirli bir anda işin yalnızca belirli bir cephesinde çalışıyor olursunuz. Örneğin business katmanına bağımlı olmadan yalnızca view katmanı ile ilgilenebilirsiniz.


MVC şablonu oluşacak karmaşıklığın kolayca yönetilmesine ek olan bir diğer özelliği de Web Forms'dan daha kolay bir şekilde test uygulamaların oluşturulmasını sağlamasıdır.

Örneğin bir Web Forms uygulamasında, tek bir sınıf hem kullanıcı girdisine cevap vermek hem de çıktıyı görüntülemek için kullanılır. Bundan dolayı Web Forms uygulamalarına otomatik testler yazmak karmaşık hale gelebilir. Çünkü tek bir sayfayı test etmek için bile, o sayfanın sınıfına bağımlı tüm çocuk kontrollerin ve diğer tüm ek sınıfların bir nesnesini oluşturmak zorunda kalırsınız. Çünkü sayfayı çalıştırdığınızda birçok sınıftan nesne üretilir, böylelikle uygulama içerisindeki bağımsız parçaların testini yazmak oldukça güçleşir. Dahası, Web Forms uygulamalarındaki testler bir Web sunucusunun var olmasını gerektirir.


MVC framework ise bileşenleri birbirinden ayırır ve büyük ölçüde interface'lerin kullanılmasını sağlar. Böylece uygulamanın diğer bileşenlerinden bağımsız olarak bileşenler ayrı ayrı test edilebilir.

Ayrıca bir MVC uygulamasının 3 ana bileşene ayrılması ile paralel geliştirim yapılabilir. Örneğin bir geliştirici view'da, diğeri controller'da çalışırken bir diğeri ise model ile ilgilenebilir.

Web Forms ile mi Yoksa MVC Framework ile mi Uygulama geliştirmeliyim?


Bir Web uygulaması oluştururken "MVC framework ile yazarsam uygulama karmaşıklığı azaltırım ama Web Forms kullanırsam kısa sürede projeyi biritirim" diye düşünüyorsanız bu ikisi arasında karar vermek için iyi düşünmelisiniz.

Belirli bir Web sitesi için MVC mi yoksa Web Forms mu kullanacağınıza karar vermeden önce her iki yaklaşımın da avantajlarına bakalım.

MVC'nin Avantajları

  • Uygulamanın model, view ve controller'a ayrıştırılması ile karmaşıklığı yönetmek daha kolaydır.
  • View state veya server-temelli form'lar kullanmaz. Böylece bir uygulamanın tüm kontrolünü geliştirici ele alabilir. Bu yüzden geliştiriciler için idealdir.
  • Web uygulamasından gelen istekleri tek bir kontrolcü üzerine devralmak için bir Front Controller kalıbı kullanır. Böylelikle zengin bir yönlendirme altyapısı oluşturmayı mümkün kılar. Front Controller hakkında daha fazla bilgi için MSDN sayfasına bakabilirsiniz.
  • Test-güdümlü geliştirimi daha iyi destekler.
  • Uygulamanın davranışları üzerinde daha fazla kontrole sahip olmak isteyen büyük geliştirici ve Web tasarımcısı ekipleri için destek sağlar.

Web Forms'un Avantajları


  • HTTP üzerinden state'leri koruyan bir event modeli sunar. Böylece Web uygylamalarının geliştirimini kolaylaştırır. Web Forms-temelli uygulamalar, yüzlerce sunucu kontrollerinde bulunan düzinelerce event sunar.
  • Sayfaların ayrı ayrı fonksiyonellik sağlamasını sağlayan Page Controller kalıbını kullanır. Page Controller hakkında daha fazla bilgi için MSDN sayfasına bakabilirsiniz. 
  • State bilgisinin yönetimini kolaylaştıran view state veya sunucu-temelli form'lar kullanır.
  • Hızlı uygulama geliştirimi için geniş yelpazedeki bileşenlerden yararlanmak isteyen küçük çaplı Web geliştiricilerinin veya tasarımcılarının bulunduğu ekip için idealdir.
  • Genellikle uygulama geliştirimi daha kolaydır, çünkü Page sınıfı, kontroller vb. bileşenler birbiriyle sıkı bir şekilde bütünleşmiştir ve genellikle MVC modelinden daha az kod yazılarak uygulamalar oluşturulabilir.


ASP.NET MVC Framework'ünün Özellikleri

  • Uygulamadaki katmanlar (input, business, UI), test edilebilirlik ve test-güdümlü geliştirim ön-tanımlı olarak ayrılmıştır. MVC framework'teki tüm önemli contract'lar interface temellidir ve uygulama içerisindeki gerçek objelerin davranışlarını taklit eden mock objeler kullanılarak bu contract'lar test edilebilir. Bir ASP.NET sürecindeki kontrolleri çalıştırmak zorunda kalmadan, hızlı ve esnek bir şekilde unit-test uygulaması çalıştırabilmesini ve .NET ile uyumlu herhangi bir unit testing framework'ünü kullanabilmesini sağlar.
  • Genişletilebilir ve takıp-çıkarılabilir bir framework'tür. MVC'deki bileşenler kolayca değiştirilebilir ve özelleştirilebilir şekilde tasarlanmıştır. Kendi view motorunuzu, URL yönlendirme politikanızı, action-method parametre serileştiriminizi ve diğer bileşenlerinizi entegre edebilirsiniz. Ayrıca MVC, Dependency Injection (DI) ve Inversion of Control (IOC) container modellerini destekler. Nesnenin kendisini üretmek için sınıfı bağımlı olmak yerine DI, objelerin bir sınıfın içine katılmasına olanak tanır. IOC ise bir nesne için diğer bir nesne gerektiğinde, ilk nesnenin ikinci nesneyi konfigürasyon dosyası gibi bir harici kaynaktan alması gerektiğini belirler. Bu şekilde testing daha kolay hale gelir.
  • Daha anlaşılır ve search edilebilir uygulamalar oluşturmanızı sağlayan güçlü bir URL-eşlemeli bileşen sunar. URL'ler, .htm, .php veya .aspx gibi dosya isimi uzantılarına sahip olmak zorunda değildir ve arama motoru optimizasyonu (SEO) ile representational state transfer (REST) adresleme gibi  URL isimlendirme kalıplarını desteklemek için tasarlanmışlardır.
  • Markup kullanımını mevcut ASP.NET sayfalarında (.aspx), user control'lerde (.ascx) ve master page'lerde (.master) desteklemek için, markup dosyaları view şablonlarışeklinde kullanılır. İçiçe master sayfaları, in-line ifadeler (<%= %>), declarative server kontrolleri, template'ler, data-binding, localization vs. gibi mevcut ASP.NET özellikleri MVC framework'ü ile kullanılabilir.
  • Halihazırdaki ASP.NET özelliklerinin kullanılmasu için de destek verilmiştir. MVC framework'ü, forms kimlik doğrulama ve Windows kimlik doğrulama, URL yetkilendirme, üyelik ve roller, çıktı ve veri önbellekleme, oturum ve profil durumu yönetimi, health monitoring, yapılandırma sistemi, ve sağlayıcı mimarisi gibi özellikleri kullanmanıza olanak tanır.

Özetle, kısa süreli kullanılacak, bakımı yapılmayacak, küçük çapta projeler üretmek istiyorsanız Web Forms kullanmaya devam edebilirsiniz. Ancak yüksek performans gerektiren, büyük çaptaki iş projeleri için MVC Framework tam bir biçilmiş kaftandır.


Tüm firmaların personel alımı yaptığı bu günlerde ASP.NET yanında MVC Framework ile uzmanlaşılırsa iyi oranda farklılık yaratılacağı düşüncesindeyim. Bu nedenle MVC Framework'ü daha detaylı bir şekilde araştırmak isteyebilirsiniz.

Sonraki yazımda görüşmek üzere..

Kaynaklar: ASP.NET