ASP.NET Core 6/Razor Sayfaları/Rotalama

Daha önce de söylediğimiz gibi Razor Pages'ta varsayılan rotalama uzantı olmadan Pages klasöründeki dosya isimlerine dayanır. Pages klasöründeki alt klasörler request'in path'ındaki segmentlere karşılık gelir. İsternirse bu varsayılan rotalama mekanizması değiştirilebilir.

MVC'ye öncelik verme

değiştir

Eğer uygulamamızda hem MVC hem de Razor Pages yapılandırması varsa varsayılan durumda taleplerin çakışması durumunda Razor sayfası çalışacaktır. Çünkü Razor sayfalarının öncelik puanı daha düşüktür. Bu varsayılan durumu değiştirmek için Program.cs dosyasında şu değişikliği yapabilirsiniz:

app.MapRazorPages().Add(b => ((RouteEndpointBuilder)b).Order = 2);

Varsayılan durumda Razor Pages'ın öncelik puanı 0, MVC'nin 1'dir. Razor Pages'ın öncelik puanı daha düşük olduğu için çakışma olması durumunda Razor Pages seçiliyordu. Bu yapılan değişiklikle çakışma olması durumunda MVC'nin seçilmesi sağlanacak. Bu sayede örneğin http://localhost:5000 adresine yapılacak talepler Index Razor sayfası tarafından değil, Home controller'ının Index action'ı tarafından karşılanacak.

Razor Pages'ta özel rota tanımlaması yapma

değiştir

Varsayılan rota tanımlaması basittir, iş görür, ancak eksiklikleri de vardır. Örneğin bir önceki dersteki örnekte OnGetAsync() metodunun model binding süreciyle id parametresini almasının tek yolu query string'tir. İlgili handler metoduna parametre geçmenin tek yolu sunucuya http://localhost:5000/Index?id=1 gibi bir istek göndermektir. Bir handler metodun parametresini segment değişkeni üzerinden göndermek için ilgili Razor sayfasındaki @page direktifini şöyle değiştirebiliriz:

@page "{id:long?}"

Artık http://localhost:5000/Index/1 gibi bir istekle de handler metoda parametre gönderebiliyoruz. Daha önce gördüğümüz rota pattern'i belirtme kuralları burada da geçerlidir. Örneğimizde id parametresi long tipine dönüştürülebilen bir değer olmalıdır ve opsiyoneldir. OnGetAsync() metot tanımına bakarsak id parametresi sağlanmadığı durumda 1 değeri varsayılan olarak alınacaktır.

@page direktifi Razor Pages'ın sağladığı varsayılan rota yapılandırmasını belirli bir sayfa için devredışı bırakmak için de kullanılabilir. Örnek:

@page "/lists/suppliers"

Bu direktifin eklendiği sayfa artık dosya ismine değil, /lists/suppliers path'ına karşılık verecektir. Buradaki path belirtiminde de yine segment değişkenleri kullanılabilir.

Bir sayfaya yeni rota ekleme

değiştir

Sayfanın başına konulan @page direktifi ile belirtilen rota, sayfanın dosya ismine göre belirlenen varsayılan rotasını geçersiz kılar. Belirli bir sayfa için hem varsayılan rotanın korunması hem de yeni rota eklenmesini istiyorsak Program.cs dosyasına aşağıdaki servis yapılandırmasını ekleyebiliriz:

builder.Services.Configure<RazorPagesOptions>(opts => {
    opts.Conventions.AddPageRoute("/Index", "/extra/page/{id:long?}");
});

Bu servis yapılandırmasının çalışabilmesi için Program.cs dosyasındaki using bildirimlerine using Microsoft.AspNetCore.Mvc.RazorPages; satırını ekleyin. Ayrıca bu servis yapılandırmasını Program.cs dosyasındaki builder.Services.AddRazorPages(); servis çağrısından daha sonraki bir konuma eklemelisiniz. Burada Razor Pages'ın ana dosyası olan Index sayfasına /extra/page/<id> path'ı ile de talepte bulunulabilmektedir. Sağlanan üçüncü parametre OnGetAsync() metoduna parametre olarak gidecektir.