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







Hiç yorum yok:

Yorum Gönder