ASP.NET MVC 5’de Attribute Routing

Selamlar;

ASP.NET MVC’de Routing aslında URI ile action’ın eşleştirilmesinden başka birşey değildir. Mvc 5 ile yeni bir routing tanımlama sistemi gelmiştir. Adı da attribute routing dir. Hem tanımlaması daha kolay, hem de daha detaylı bir tanımlama ortamı sağlamaktadır.

ASP.NET MVC önceki versiyonlarında routing RouteConfig.cs altında aşağıdaki gibi tanımlanırdı.

Yeni sistemde routing şu an detayına bakmadan aşağıdaki gibi kolaylıkla tanımlanabilir.

Öncelikle Attribute Routing’in kullanılabilmesi için RegisterRoutes altında MapMvcAttributeRoutes()’un aşağıdaki gibi tanımlanması gerekmektedir:

Route Tanımlama: Aşağıda Index() action’ının route’u aşağıda “books” olarak, Index(string title) action’ı “books/{title}” olarak ve Detail(string title) action’ı “books/{title}/detail” olarak tanımlanmıştır.

Route Prefix:  Kök yolun belirlendiği attribute’dur. Böylece aşağıda görüldüğü gibi Actionlar’da ana route’un, örneğin books’un belirtilmesine gerek yoktur.

Ayrıca istenir ise RoutePrefix “~” işareti ile Action tarafında ezilebilir. Aşağıdaki örnekte “reviews” kök route’u Index() action’ı için ezilerek “books” yapılmıştır.

RouteDefault

Optional Uri ve Default Değer Atama: Aşağıda görüldüğü gibi parametre yanına “?” konarak route parametrelerinin null değer alabilmesi sağlanmaktadır.

Yine aşağıda görüldüğü gibi route parametresine herhangi bir değer gelmediğinde default belirlenen bir değer kolaylıkla atanabilmektedir.

Default Route: Aşağıda görüldüğü gibi RoutePrefix ile kök route “reviews” olarak belirlenmiştir. Route attribute değeri olarak da “action=Index” yazılarak default gidilecek action “Index” olarak belirtilmiştir.

Route Constraint: Genel yazım şekli {parameter:constraint} dir. Amaç route’da alınacak parametreye bir takım kurallar tanımlamaktır. Örneğin aşağıda ilkin Index() methodu sayısal ‘id’ değer bekliyen bir action {id:int} iken ikinci tanımlanan Index() string ‘name’ bekleyen {name} bir  action’dır.

Örneğin aşağıda Index() action’ı için beklenen sayısal id değeri en küçük “1” olacak şekilde {id:int:min(1)} bir kural tanımlanmıştır.

Örneğin aşağıda Index() action’ının string parametresi maxlength(5) olarak atanmıştır. Yani maximum karakter sayısı 5 dir. Aynı zamanda nullable bir parametredir. “/books/test” örneğinde “test” 5 karakterden küçük olduğu için kural sağlanmıştır. Aynı şekilde “books/deneme_yazısı” örneğinde “deneme_yazısı” 5 karakterden büyük olduğu için kural sağlanmamıştır. Son olarak “/books/” örneğinde paramtere boş değer alabildiği için kural sağlanmıştır.

Alttaki Route Constraint listesi msdn.com’dan alınmıştır.

RouteConstraint

Custom Route Constraint: Bazen duruma göre özel kurallar yazılması gerekebilir. İşte bu durumda Custom Route Constraintler devreye girer. Aşağıdaki örnekte kabul edilebilecek bir isim listesi alınacak. Bunun dışında gelen isimler kabul edilmeyecek. Bunun için öncelikle AllowListConstraint class’ı oluşturulur. Constructor ‘ında izin verilecek string liste “|” işareti ile ayrılarak atanır. Match() methodu ile ilgili izin verilen liste gezilerek gelen değerin bu listede olup olmadığına bakılarak bool bir değer dönülür.

İlgili RouteConstraint RouteConfig classında aşağıdaki gibi tanımlanır.

Aşağıdaki örnekte Index() action’ı aldığı name parametresine “bora|duru” tanımlaması ile sadece “bora ve duru” isimlerine izin verilmiştir. Yani “books/bora” veya “books/duru” haricinde bu action’a erişilemez.

Route Name: Aşağıdaki örnekte de görüldüğü gibi route’a isim verilerek Uri’ye view’da erişim kolaylaşmıştır.

Areas: Bir controller’ı  [RouteArea] attribute’ü ile bir guruba atayabiliriz. Böylece AreaRegistration classdan ilgili area kolaylıkla kaldırılabilir. Ayrıca Controllerlar bir guruba atanmış olur. Aşağıdaki örnekde Index()’e erişim “/library/reviews/books/5” şeklinde yapılmaktadır.

Aşağıdaki link tıklandığında “library/reviews/detail” şeklinde bir url’e gitmektedir. Burada “library” yukarıda tanımladığımız area’yı temsil etmektedir.

Böylece ASP.NET MVC 5’de route işlemlerinde neler yapabileceğimizi gördük. Bize sağladığı kolaylıkları ve faydaları mümkün olduğunca incelemeye çalıştık.

Yeni bir makalede görüşmek üzere hepinize hoşçakalın.

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

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

17 Cevaplar

  1. Çağatay dedi ki:

    Çok güzel açıklamışsınız. Paylaşım için teşekkür ederim.

  2. talha dedi ki:

    Teşekkürler Bu Konuyuda Sayenizde Anlamış Bulunmaktayım .

  3. Serhat dedi ki:

    Teşekkürler Bora Bey.

  4. Enes dedi ki:

    Merhaba, eksik bir şey var var buradakileri uygulamaya uğraştım ama route çalışmadı. Başka yerlere baktım attr route ların çalışması için registerRoutes bölümüne ” routes.MapMvcAttributeRoutes(); ” şeklinde ekleme yapmak gerek güncellerseniz sevinirim

    • borsoft dedi ki:

      Teşekkürler,
      İlk fırsatta güncellerim. 3.5 yıl önceki bir makale :)

      İyi çalışmalar.

  5. ilker yıldız dedi ki:

    [Route(“{NewsCategori}”)]=Kategori
    [Route(“{NewsTitle}”)]=Haber Detay
    Bu şekilde 2 route yaptım ama 2 sine yönlendirme yaparken çakışıyorum

    örnek haberler.com yapmış kategori ye göre url haber başlığına göre detay sayfası

  6. Anıl dedi ki:

    Faydalı bilgi için teşekkürler

  7. Emre dedi ki:

    Hocam Selamlar,

    Örneğin /Blog/Blog-Kategorisi ve /Blog/blog-yazisi-detayi gibi route tanımlayabiliyor muyuz? Ben blogun içerisinde bir kategoriye de tıklasam /Blog/blog-kategorisi sonra yazıya da tıklasam /Blog/blog-yazisi diye görünmesini istiyorum. Blog anadizinin de çalışsın 2 sayfada da böyle bir şey mümkün mü? Çünkü bir kaç sitede böyle bir şey gördüm ama MVC de nasıl yapılır çözemedim çakışma oluyor.

    • borsoft dedi ki:

      Selamlar Emre,
      Evet mümkün. SEO çalışması için yapılacak her şey mümkündür :)

      İyi çalışmalar.

  8. nurullah dedi ki:

    Merhaba hocam;
    Yazınız için teşekkürler. Benim şöyle bir sorum olacak.
    Örn: CategoriesController üzerinde [Route(“kategoriler”)] yaptım daha sonra ProductController içinde [Route(“{CategoryName}”)] yaptığımda ikisi çakışma yapıyor.
    Route Attribute için Name tanımlası yapıp @Url.RouteUrl ile denedim yinede olmuyor. Farklı bi çözüm varmıdır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.