Bu yazıda, Core'daki yeni yönlendirme özelliklerine dalacağız. ASP.NET MVC ve Web API konusunda bir geçmişiniz varsa, yönlendirmenin yeni bir kavram olmadığını biliyor olabilirsiniz. Ancak, .NET'te web geliştirmeye yeni başladıysanız, yönlendirme, bir istek URL'sini bir denetleyici şeklindeki bir işleyiciye eşlemeyi sorumlu olan bir sistemdir. Bir istek aldığında, Core, gelen isteği işleyebilecek bir işleyici arar ve bu işlem, bir dizi kural temelinde gerçekleştirilir. Aslında, yönlendirme, önceki yazıda öğrendiğimiz "sadece" bir ara yazılımdır.
Yeni bir route oluşturmak için route şablonu sözdizimini bilmeniz gerekir. ASP.NET MVC'de yönlendirme sözdizimi başlangıçtan itibaren mevcutken, Core bu olanakları büyük ölçüde genişletmiştir. Core'da yeni bir web uygulaması oluşturduğunuzda, Startup.cs dosyasında varsayılan bir route otomatik olarak ayarlanır. Boş bir proje ile başlıyorsanız, Microsoft.AspNetCore.Routing NuGet paketini yüklemeniz gerekecektir:
Install-Package Microsoft.AspNetCore.Routing
MVC'yi web projesine eklemek için, Startup.cs dosyasında UseMvc metodunu çağırın ve aşağıdaki gibi varsayılan bir şablon verin:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
(Eğer Visual Studio üzerinden yeni bir MVC uygulaması oluşturursanız, NuGet paketi otomatik olarak yüklenir ve UseMvc metodu Startup.cs dosyasına eklenir.)
UseMvc metodunda belirtilen şablon, Core'a /some/url/42 gibi istekleri, SomeController adında bir denetleyiciye ve Url adında bir eyleme yönlendirecek şekilde ayarlanır; burada id parametresini alır. Şablon içindeki süslü parantezlere dikkat edin. Süslü parantezler içindeki içerik, bir segmenti temsil eder ve bu konuya daha sonra döneceğiz. Öncekilerden farklı olarak, varsayılan değerler segmentlerin bir parçası olarak gömülü olabilir, defaults parametresi aracılığıyla değil (ancak yine de desteklenir). Yukarıdaki örnekte, / isteği HomeController'ın Index eylemini çağıracak ve id parametresi sağlanmadığında veya bu parametrenin değeri null olduğunda işlenecektir. İsteğe bağlı parametreler, bir soru işareti ile sonlandırılır (id?).
Yeni Yönlendirme Özellikleri
Önceki ASP.NET sürümlerinde gördüğümüz özelliklerin yanı sıra, Core'da eklenen bazı yeni özellikler vardır. Şimdi, yönlendirme işlemlerine büyük bir kontrol sağlamak için eklenen yeni özelliklere bakalım.
Yönlendirme Kısıtlamaları
Yönlendirme kısıtlamaları, bir rotadaki izin verilen değerler üzerinde çok daha fazla kontrol sağlar. ASP.NET MVC ile çalışan çoğu kişi, bir rotanın neden bir denetleyiciyle eşleşmediğini anlamaya çalışarak saatler harcamıştır. Yönlendirme kısıtlamaları, bir veya daha fazla segmentteki olası değerlere bazı kısıtlamalar koyar. Bir örneğe göz atalım:
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id:int}");
Bu örnekte, Core'a id parametresinin tamsayı türünde olması gerektiğini belirtiyoruz. Bu, Core'a id parametresi bir dize olduğunda (örneğin: some/url/somestring) bu isteği eşlememesi gerektiğini söyler. Ayrıca, tamsayılar üzerinde aralıklar, dizeler üzerinde maksimum uzunluk gibi kısıtlamalar tanımlayabilir ve çok daha fazlasını yapabilirsiniz. Yönlendirme Kısıtlamaları hakkında daha fazla bilgi için resmi Yönlendirme Kısıtlama Referansı sayfasını inceleyebilirsiniz.
Joker Karakterlerin Kullanımı
Bir diğer yeni özellik, joker karakterlerin kullanımıdır. Joker karakterler, belirli bir segmentin parçası olarak genelleme yapmak için kullanılır ve bu segmentlerin esnek bir şekilde işlenmesini sağlar. Bir örnek üzerinden inceleyelim:
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id:int}/{*more}");
Bu yapılandırma, /some/url/42 gibi istekleri hem /some/url/42 hem de /some/url/42/details gibi daha fazla segment içeren URL'lere yönlendirebilir. Joker karakter *more, sıfır veya daha fazla segmenti eşleyebilir. Örneğin, bu rota /some/url/42/details/show gibi URL'lere de uyum sağlar.
Önceki sürümlerde olduğu gibi, rota şablonları sadece uygulama başlatılırken değil, niteliklerde de belirtilebilir:
[Route("home/index/{id:int}/{*more}")]
public IActionResult Index(int id)
{
...
return View();
}
Bu örnekte, Index eylemi belirtilen rotaya uyacak şekilde yapılandırılmıştır. *more joker karakteri, istek URL'sindeki herhangi bir ek segmenti alacak ve işleme dahil edecektir.
