ASP.NET MVC’de routing mekanizmasının temelleri
ASP.NET MVC, modern web uygulamaları geliştirmek için güçlü bir altyapı sunar. Bu altyapının en temel ve kritik bileşenlerinden biri de routing (yönlendirme) sistemidir. Routing, gelen tarayıcı isteklerini (URL’leri) belirli controller sınıfları ve bu sınıflar içindeki action metotlarıyla eşleştiren bir mekanizmadır. Bu sayede, kullanıcıların gördüğü URL’ler, sunucudaki fiziksel dosya yollarıyla birebir eşleşmek zorunda kalmaz. Bu durum, hem arama motoru optimizasyonu (SEO) için daha anlamlı ve temiz URL’ler oluşturulmasını sağlar hem de uygulamanın URL yapısını daha esnek ve yönetilebilir kılar. Bu yazıda, ASP.NET MVC routing sistemini tüm yönleriyle ele alacağız. RouteConfig.cs dosyasının rolünden başlayarak varsayılan route yapısını, özel route tanımlamalarını ve son olarak MVC 5 ile hayatımıza giren esnek Attribute Routing konusunu örneklerle detaylandıracağız.
RouteConfig.cs ve varsayılan route yapısı
Bir ASP.NET MVC projesi oluşturulduğunda, yönlendirme kurallarının merkezi olarak tanımlandığı yer App_Start klasörü altındaki RouteConfig.cs dosyasıdır. Uygulama ilk başladığında Global.asax.cs içerisindeki Application_Start metodu, RouteConfig.RegisterRoutes metodunu çağırarak burada tanımlanan kuralları aktif hale getirir. Bu dosyadaki varsayılan yapı, çoğu projenin temel ihtiyaçlarını karşılayacak şekilde tasarlanmıştır.
Varsayılan route tanımı genellikle şu şekildedir:
| public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapRoute( |
Bu tanımı parçalara ayırarak inceleyelim:
- name: “Default” olarak adlandırılan bu kural, yönlendirme koleksiyonu içinde benzersiz bir isimle tanımlanır.
- url: “{controller}/{action}/{id}” formatı, gelen URL’nin nasıl ayrıştırılacağını belirtir. Süslü parantezler içindeki ifadeler, URL segmentlerinden alınacak değerler için birer yer tutucudur.
- defaults: Bu bölüm, URL’de ilgili segmentlerin eksik olması durumunda varsayılan olarak hangi değerlerin kullanılacağını belirler. Örneğin, kullanıcı sadece site adresini (www.example.com) yazdığında, varsayılan olarak Home controller’ının Index action’ı çalıştırılır. id = UrlParameter.Optional ifadesi ise, id parametresinin URL’de bulunmasının zorunlu olmadığını belirtir.
Özel route tanımlama ve öncelik sırası
Varsayılan route yapısı esnek olsa da, projelerin özel ihtiyaçları için yeterli olmayabilir. Örneğin, bir blog sitesi için /blog/2023/10/asp-net-mvc-routing gibi daha anlamlı bir URL yapısı kurmak isteyebiliriz. Bu gibi durumlarda özel route tanımlamaları devreye girer. Özel route’lar tanımlanırken dikkat edilmesi gereken en önemli nokta, RouteConfig.cs dosyasındaki sıralamadır. ASP.NET MVC routing motoru, gelen isteği yukarıdan aşağıya doğru ilk eşleşen kurala göre işler. Bu nedenle, daha spesifik ve özel kurallar her zaman daha genel olan varsayılan kuraldan önce tanımlanmalıdır.
Örneğin, statik sayfaları yönetmek için /hakkimizda veya /iletisim gibi URL’ler oluşturmak istediğimizi varsayalım. Bu URL’leri tek bir controller altında toplayabiliriz:
| public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); // Özel ve spesifik route’lar önce tanımlanır // Genel route en sonda yer alır |
Bu örnekte, /hakkimizda isteği geldiğinde routing motoru, bu isteği PageController içindeki hakkimizda action’ına yönlendirir. Constraints (kısıtlamalar) kullanarak bu kuralın sadece belirli action isimleri için geçerli olmasını sağladık. Eğer bu kuralı varsayılan kuraldan sonra tanımlasaydık, sistem /hakkimizda isteğini “hakkimizda” isminde bir controller olarak yorumlamaya çalışacak ve hata verecekti.
Esneklik ve okunabilirlik için attribute routing
MVC 5 ile birlikte tanıtılan Attribute Routing (Öznitelik Tabanlı Yönlendirme), route tanımlarını merkezi bir RouteConfig.cs dosyasından alıp doğrudan ilgili controller ve action metotlarının üzerine taşır. Bu yaklaşım, özellikle büyük ve karmaşık projelerde kodun okunabilirliğini ve yönetilebilirliğini artırır. Hangi URL’nin hangi metoda karşılık geldiğini görmek için sürekli RouteConfig.cs dosyasına bakmak yerine, doğrudan metodun üzerinde görebilirsiniz.
Attribute Routing’i aktif etmek için öncelikle RouteConfig.cs dosyasında routes.MapMvcAttributeRoutes(); metodunu çağırmanız gerekir. Bu satır genellikle convention-based (geleneksel) route tanımlarından önce yer almalıdır.
Kullanımı oldukça basittir. [Route], [RoutePrefix] ve [HttpGet], [HttpPost] gibi öznitelikler kullanılır.
| [RoutePrefix(“urunler”)] public class ProductsController : Controller { // URL: /urunler [Route(“”)] public ActionResult Index() { return View(); } // URL: /urunler/detay/5 // URL: /urunler/kategori/elektronik |
Bu örnekte [RoutePrefix(“urunler”)] özniteliği, bu controller içindeki tüm action’ların URL’lerinin “urunler” ile başlayacağını belirtir. [Route(“”)], prefix’in kendisini (yani /urunler) hedefler. [Route(“detay/{id:int}”)] ise hem URL yapısını tanımlar hem de id parametresinin bir tamsayı (int) olması gerektiği yönünde bir kısıtlama (constraint) ekler. Bu sayede yönlendirme kuralları, ait oldukları kod bloklarına daha yakın ve daha anlamlı bir şekilde yönetilir.
Sonuç
ASP.NET MVC’deki routing sistemi, bir web uygulamasının URL yapısını şekillendiren ve kullanıcı isteklerini doğru hedeflere yönlendiren temel bir mekanizmadır. Bu makalede, routing sisteminin iki ana yaklaşımını ele aldık. İlk olarak, RouteConfig.cs dosyasında yönetilen geleneksel (convention-based) routing yapısını inceledik. Varsayılan {controller}/{action}/{id} kuralının nasıl çalıştığını, URL segmentlerinin nasıl varsayılan değerler aldığını ve UrlParameter.Optional kullanımını gördük. Ardından, daha spesifik URL yapıları oluşturmak için özel route’ların nasıl tanımlanacağını ve bu tanımlamalarda sıralamanın neden kritik olduğunu vurguladık. Son olarak, MVC 5 ile gelen ve route tanımlarını doğrudan controller ve action’lar üzerine taşıyarak kod okunabilirliğini artıran Attribute Routing yöntemini örneklerle açıkladık. Sonuç olarak, projenin ihtiyaçlarına göre bu iki yöntemi bir arada veya ayrı ayrı kullanarak, hem kullanıcı dostu hem de yönetimi kolay, esnek ve güçlü URL yapıları oluşturmak mümkündür.
Resim Sahibi: Google DeepMind
https://www.pexels.com/@googledeepmind