4 Mayıs 2014 Pazar

Routing

Merhaba arkadaşlar, geçen hafta Model'lerden bahsetmiştik. Bu yazımda ASP.NET MVC'nin önemli bir parçası olan "Routing" yani yönlendirmeden bahsedeceğim.

MVC Framework'ün ortaya çıkmasından önce ASP.NET, istek gönderilen URL'ler ve sunucudaki dosyalar arasında doğrudan bir ilişki olduğunu var sayıyordu. Sunucunun görevi gönderilen isteği web tarayıcısından almak ve ona karşılık gelen dosyanın çıktısını göndermekti.

Bu yaklaşım ASP.NET Web Forms uygulamalarında bir sorun teşkil etmiyor, çünkü her aspx sayfası hem bir dosya hem de bir isteğe karşı verilen cevap oluyor. Ama bu, sunucuya gelen isteklerin controller sınıfları içindeki action metotlarıyla işlendiği ve sunucudaki dosyalarla birebir bir ilişkinin olmadığı MVC uygulamaları için pek bir anlam ifade etmiyor.

MVC URL'lerini işlemek için ASP.NET platformu routing sistemini kullanıyor. Bu yazımda routing sistemini kullanarak nasıl esnek bir şekilde URL işlemenin yapıldığından bahsedeceğim. İleride göreceğiniz gibi bu sistem istediğiniz gibi URL kalıpları oluşturmanızı sağlayacak. Bu sistemin iki fonksiyonu mevcut:

  • Gelen URL'in incelenmesi ve isteğin hangi action ve controller için gönderildiğinin bulunması.
  • Giden URL'lerin oluşturulması. Bunlar kullanıcı linke tıkladığında belli bir olayın gerçekleşmesi için view'lar tarafından oluşturulan HTML'de görüntülenen URL'lerdir.

Yukarıda da bahsettiğim gibi eğer bir ASP.NET uygulaması routing kullanmıyorsa gelen bir istek fiziksel bir dosyayla ilişkilendirilir, bir aspx dosyası gibi. Mesela, http://deneme/uygulama/Users.aspx?id=2 URL'i için gönderilen bir istek Users.aspx dosyası ile eşleşir. Web sayfası query string değeri olan id=2'yi ne tür bir içeriğin gösterileceğini belirlemek için kullanır. ASP.NET routing ile http://deneme/uygulama/User/2 gibi bir URL için http://deneme/uygulama/User/{id} rotası kullanılarak id'si 2 olan kullanıcının sayfasının getirilmesi işlemi gerçekleştirilebilir.

Rotalar

Rota, bir işleyiciye haritalanan URL kalıbıdır. Bu işleyici ASP.NET Web Forms uygulamalarındaki aspx dosyaları gibi fiziksel bir dosya da olabilir ya da MVC'deki controller'lar gibi isteği işleyen bir sınıfa da karşılık gelebilir. Bir rota tanımlamak için bir URL kalıbı, bir işleyici ve isteğe bağlı olarak rota için bir isim belirleyerek Route sınıfının bir nesnesinin oluşturulması gerekir. Bir rota eklemek için RouteTable sınıfının statik Routes özelliğine Route nesnesini eklemek yeterlidir. Routes özelliği uygulamadaki bütün rotaları tutan RouteCollection nesnesidir. Genellikle rota eklemek için gerekli olan kodu MVC uygulamasında yazmanıza gerek yoktur. Daha önceden oluşturduğumuz MVC projesinin içine bakarsanız Visual Studio'nun ön tanımlı olarak URL rotalarını tanımladığını görürsünüz. Bunlar projedeki Global.asax dosyasının içinde tanımlanmış MvcApplication sınıfının içindedir.

URL Kalıpları

Bir URL kalıbı sabit değerler içerebildiği gibi, URL parametreleri olarak da adlandırılan değişken yer tutucular da içerebilir. Bunlar, "/" karakteri ile ayrılan URL bölümlerinde yer alır.

Bir URL kalıbının içinde, "{" ve "}" parantezleri arasına yazarak yer tutucular tanımlanabilir. Bir bölüm içinde birden fazla yer tutucu tanımlanabilir, ancak belli bir karakterle ayrılmaları gerekir. Mesela, "{language}-{country}/{action}" örneğini doğru bir kalıp olarak düşünebiliriz. Ancak "{language}{country}/{action}" örneğinde {language} ve {country} belli bir karakterle ayrılmadığı için bu geçersiz bir kalıptır. Bu yüzden routing sistemi language değeri ile country değerini nereden ayıracağını belirleyemeyecektir.

Aşağıdaki tablo bazı geçerli URL kalıplarını ve bunlarla eşleşebilecek örnekleri göstermektedir:

Rota TanımıEşleşen URL'e Örnek
{controller}/{action}/{id}/Products/show/beverages
{table}/Details.aspx/Products/Details.aspx
blog/{action}/{entry}/blog/show/123
{reporttype}/{year}/{month}/{day}/sales/2008/1/5
{locale}/{action}/US/show
{language}-{country}/{action}/en-US/show

MVC Uygulamalarına Rota Eklemek

Daha önce de belirttiğim gibi Visual Studio, MVC uygulaması şablonunu kullanırsanız sizin için varsayılan rotaları oluşturacaktır. Bu varsayılan rota controller sınıflarında tanımlamış olduğunuz action metotlarını otomatik olarak çağıracaktır. Eğer kendi rotanızı eklemek istiyorsanız MapRoute(RouteCollection, String, String) metodunu kullanabilirsiniz.

Aşağıda Visual Studio'nun Global.asax içinde varsayılan olarak oluşturduğu rotayı görebilirsiniz. Visual Studio 2012 ile oluşturulmuş dosyalarda aşağıdaki gibi, rota tanımlamaları App_Start klasörü içindeki RouteConfig.cs dosyasında yer almaktadır.
// Global.asax dosyası
namespace MerhabaMVC {
    public class MvcApplication : System.Web.HttpApplication {
        protected void Application_Start() {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}
 // App_Start klasörü içindeki RouteConfig.cs dosyası
namespace MerhabaMVC {
    public class RouteConfig {
        public static void RegisterRoutes(RouteCollection routes) {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // WebResource.axd ya da ScriptResource.axd gibi dosyaların controller'a aktarılmasını önlemek için

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}
Her ne kadar çoğu zaman kendi rotanızı oluşturmanıza gerek kalmasa da bazı durumlarda bu gerekebilir. Mesela bir blog uygulaması yazıyorsunuz ve /Archive/04-05-2014 şeklinde URL'leri tanımasını istiyorsunuz. Bu URL'in 04-05-2014 tarihindeki blog kayıtlarını getirdiğini düşünelim. Global.asax'daki varsayılan rota bu URL'den şu parametreleri çıkarır:
Controller: Archive
Action: 04-05-2014

Ancak bu durumda 04-05-2014 gibi bir action'a ihtiyaç duyarsınız, bu da mümkün değildir. Bunun yerine bu tarihi action'a parametre olarak gönderebilirsiniz. Aşağıda BlogArchive adındaki blog kayıtlarını doğru bir şekilde işleyebilecek rotayı görebilirsiniz.
public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "BlogArchive",
        url: "Archive/{entryDate}",
        defaults: new {controller = "Blog", action = "Archive" }
    );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
Bu rota için kullanılacak Blog controller'ı da aşağıdaki gibi olacaktır:
namespace MerhabaMVC.Controllers
{
    public class BlogController : Controller
    {
        public string Archive(DateTime entryDate) {
            return entryDate.ToString();
        }
    }
}
Bu yazımda ASP.NET MVC'nin önemli bir özelliği olan routing'den bahsettim. Nasıl kendi rotamızı tanımlayabileceğimize değindim. Haftaya HTML yardımcı metotlarından bahsedeceğim. Şimdilik hoşça kalın.

Kaynaklar:

0 yorum :