ASP.NET MVC Routing

ASP.NET MVC içerisinde yer alan ve gelen istekleri yönetmek için kullanılan route veya routing yapısı ve kullanımı ile ilgili bilgiler yer alıyor.

Routing nedir?

Routing, route sıklıkla ağ sistemlerinde kullanılan ve rota, yönlendirme gibi anlamlara gelen bir terimdir.

Bu yapı birçok web programlama dilinde web sunucularına gelen istekleri yönetmek için kullanılır.

ASP.NET MVC Routing

ASP.NET MVC içerisinde yer alan routing yapısı gelen web isteklerini Controller ile eşleştirir.

ASP.NET ile hazırlanan bir web projesi başlatıldığında ilk olarak .NET Framework için global.asax dosyasında yer alan Application_Start metodunu .NET Core için Program.cs içerisinde yer alan Main metodunu çalıştırılır.

Bu metot içerisinde web sayfalarında kullanılan cookie, session, auth ve route gibi yapıların değerleri atanır.

MVC içerisindeki routing yapısı System.Web.Routing alanında yer alan Routes property içerisinde saklanır.

Property RouteCollection sınıfının bir örneği olduğundan routing işlemi sınıf içerisinde yer alan metotlar ve sınıfa sonradan eklenen extension metotlarla yapılır.

Routing işlemleri için birden fazla overload kullanımı olan MapRoute metodu kullanılabilir.

Visual Studio geliştirme ortamında MVC projesi oluşturulduğunda varsayılan olarak aşağıdaki gibi bir routing oluşturur.

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

.NET Core için

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

Metodun name paramatresi rota adını, url gelen istekleri, defaults ise eşleşen bir istek olmadığında çalıştırılacak Controller yapısını ifade eder.

Url yapısı Merhaba/Dunya/1 gibi bir istek geldiğinde MerhabaController sınıfı içerisinde yer alan Dunya metodunun id parametresi 1 değeri ile çalıştırılacağını ifade eder.

Metot ayrıca gelen istekleri kısıtlamak için constraints ve birden fazla namespace kullanıldığında ortaya çıkan karışıklığı önlemek için namespaces parametresini alır.

Örnek kullanım aşağıda yer almaktadır.

routes.MapRoute(
    name: "Kategori",
    url: "Kategori/{kategoriAdi}",
    defaults: new { controller = "Kategori", action = "Index" },
    constraints: new { kategoriAdi = @"\w+" },
    namespaces: new string[] { "projeAdi.Controllers" }
);

Ancak web sayfasındaki alanlar arttıkça routing yönetimi daha da zorlaşacaktır.

Ayrıca Controller içerisinde yapılan değişikliklerin Routing içerisinde de yapılması gerekecektir.

ASP.NET MVC Attribute Routing

Attribute Routing özelliği ASP.NET MVC 5 ile birlikte gelen sınıf ve metotlara nitelik ekleyerek Routing işlemlerini daha kolay yapmaya imkan veren bir özelliktir.

Özelliğin kullanılabilmesi için MapMvcAttributeRoutes metodu ile aktif edilmesi gerekir.

Visual Studio tarafından oluşturulan RouteConfig sınıfı RegisterRoutes metodu aşağıdaki gibi olacaktır.

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

    routes.MapMvcAttributeRoutes();

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

Özellik aktif edildikten sonra herhangi bir Controller sınıfına nitelik eklenerek aşağıdaki gibi kullanılır.

public class KategoriController : Controller
{
    [Route("Kategori/{kategoriAdi}")]
    public ActionResult Index(string kategoriAdi)
    {
        return View();
    }
}

Örnek /Kategori/genel gibi bir kullanımda çalışacaktır.

NOT: Paremetre eklemek için {} kullanılır.

Parametre

Parametreyi isteğe bağlı yapmak için parametre sonuna soru işareti (?) eklemek yeterli olacaktır.

[Route("Kategori/{kategoriAdi?}")]
public ActionResult Index(string kategoriAdi)
{
    if (string.IsNullOrWhiteSpace(kategoriAdi))
    {
        return View();  // Tüm kategorileri göster.
    }
    return View();
}

Kısıtlamalar

Attribute Routing özelliğine aşağıdaki gibi kısıtlama da ekleyebiliriz.

[Route("Kategori/{kategoriAdi:alpha:length(10, 20)}")]
public ActionResult Index(string kategoriAdi)
{
    return View();
}

Route sadece 10 ila 20 arasında karakter içeren parametreler için çalışacaktır.

KısıtlamaKullanım
alpha{x:alpha}
bool{x:bool}
datetime{x:datetime}
decimal{x:decimal}
double{x:double}
float{x:float}
guid{x:guid}
int{x:int}
length{x:length(6)}
{x:length(1,20)}
long{x:long}
max{x:max(10)}
maxlength{x:maxlength(10)}
min{x:min(10)}
minlength{x:minlength(10)}
range{x:range(10,50)}
regex{x:regex(^\d{3}-\d{3}-\d{4}$)}

Kaynak: https://devblogs.microsoft.com/aspnet/attribute-routing-in-asp-net-mvc-5/

Ön ek

Controller içerisindeki metotlar aşağıdaki gibi aynı ön eki kullanabilir.

[Route("urun")]
public ActionResult Index() { }
[Route("urun/{id:int}")]
public ActionResult Goruntule(int id) { }
[Route("urun/{id:int}/duzenle")]
public ActionResult Duzenle(int id) { }
[Route("urun/{id:int}/sil")]
public ActionResult Sil(int id) { }

Bu işlemi daha da kolay hale getirmek için sınıfa RoutePrefix niteliği ekleyebiliriz.

[RoutePrefix("urun")]
public class UrunController : Controller
{
    [Route]
    public ActionResult Index() { }
    [Route("{id}")]
    public ActionResult Goruntule(int id) { }
    [Route("{id:int}/duzenle")]
    public ActionResult Duzenle(int id) { }
    [Route("{id:int}/sil")]
    public ActionResult Sil(int id) { }
}

NOT: Varsayılan route için sadece [Route] kullanıldığına dikkat edin.

Sıralama

Aşağıdaki gibi bir kullanımda sıralama yapılmadığından /arama gibi bir istek geldiğinde {id} ile eşleşecektir.

[Route("arama")]
public ActionResult Arama() { }

[Route("{id}")]
public ActionResult Yazi(int id) { }

Bu durumu {id:int} gibi bir kısıtlama ile çözebileceğimiz gibi aşağıdaki gibi sıralama değeri vererekte çözebiliriz.

[Route("arama", Order = 1)]
public ActionResult Arama() { }

[Route("{id}", Order = 2)]
public ActionResult Yazi(int id) { }

NOT: Bu gibi durumlar için tanımlanan route yapısının benzersiz olmasına dikkat edin.

Adlandırma

View içerisindeki bağlantı oluşturan @Url.RouteUrl gibi yapılar için adlandırma ekleme faydalı olacaktır.

[Route("arama", Name = "arama", Order = 1)]
public ActionResult Arama() { }
[Route("{id}", Name = "yazi", Order = 2)]
public ActionResult Yazi(int id) { }

Sonuç

ASP.NET MVC kullanarak geliştirme yapıldığında attribute routing özelliğini kullanmak kolaylık sağlayacaktır.

Ayrıca Attribute routing özelliğini varsayılan route özelliği ile kullanmak olası hatalara karşı faydalı olacaktır.

.NET Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlara'da bakmalısın!