Open KevserAkbas opened 3 years ago
Routing i etkinleştirmek ve desteklemek için uygulamamızı yapılandırmamız gerekir
Routing i yapılandırdığım Startup sınıfının yapılandırma yönteminin bir parçası olan bir parçacığı görebilirsiniz.
Öncelikle, UseRouting aracılığıyla yönlendirme middleware ı getirmemiz gerekiyor.
Ama yine de sayfamızı şimdiye kadar nasıl gördüğümüzü merak ediyor olabilirsiniz.
Cevap şu ki, ASP.NET Core'dan sitemizi varsayılan bir rota ile yapılandırmasını istemiştik diyelim.
Startup da UseEndpoints'i çağırarak, aslında çoğu uygulama için çalışacak çok genel bir rota geçtik.
MapControllerRoute'u kullanarak, uygulamama kural tabanlı (convention-based) bir rota ekliyorum ve daha önce gördüğümüz bir kalıbı var, controller / action.
Temel olarak, bu kalıba sahip olan tüm istekler artık bu model kullanılarak eşleştirilebilir ve
controller ve action, istek URL'sinden çıkarılır ve ardından controller a iletilir ve bunun işlenmesi için action u gerçekleştirilir.
Çoğu uygulamanın tanımlanmış birden çok yolu olacaktır.
Eşleştirme sistemi, tanımlanmış tüm modellerde sırayla çalışacak ve ilk eşleşme kullanılacaktır.
Bu nedenle tanımlanmış birden fazla rotanız varsa, bunların en özelleri en üstte olacak şekilde doğru sırada olmasını sağlamak önemlidir.
ASP.NET Core 2.1, uygulamayı yapılandırmak için biraz farklı bir yol kullanır.
Burada UseMvc kullanıyoruz ve MapRoute yöntemini kullanarak rotayı geçiyoruz.
Ancak net sonuç tamamen aynı olacaktır.
Yine de oluşturulan rotalarla daha fazlasını yapabiliriz.
Burada gördüğünüz koda bir göz atalım.
Şimdi yeşille vurgulanan kontrolör ve eylem segmentleri için tanımlı değerlerim olduğunu görebilirsiniz.
Bunlar rota varsayılanlarıdır (default).
Controller için bu, Home olarak ayarlanmıştır ve action için Index olarak ayarlanmıştır.
Şimdi, controller veya action parçası için bir değer belirtmeyen bir istek geldiğinde, MVC bu varsayılanları kullanacaktır.
Bu, isteği sitenin kök dizinine göndermemizi sağlar, böylece bethanyspieshop.com ve otomatik olarak ana denetleyicideki dizin eylemi yürütülür.
Elbette, örneğin daha önce gördüğümüz üçüncü bölümü de geçmek mümkün.
Listede seçilen pie gibi bir değeri iletmemiz gerektiğini söyleyin, böylece ayrıntı sayfası hangi ayrıntıların gösterilmesi gerektiğini bilir.
İd parametresinin eklendiği burada gördüğünüz kalıp, bunu yapmamıza izin verecektir.
Controller eyleminde, şimdi bu değere girmemiz gerekiyor.
Kalıp eşleştirmenin çalışması için, burada gördüğünüz gibi metodun bir id parametresi ile tanımlanması gerekir.
Model bağlama (model binding) adı verilen bir süreç aracılığıyla, URL'deki id değeri burada gördüğünüz eylem parametresine aktarılacaktır.
Burada üçüncü segmentin de dikkat çekici bir karakteri var, soru işareti.
Bu değeri ekleyerek, segment artık isteğe bağlı hale gelir.
Kalıbın hala bir eşleşme olması için talebin bir parçası olması gerekli değildir.
Bunu eklediğimiz için bu rota artık hem id segmenti içeren isteklerde hem de içermeyen isteklerde kullanılabilir.
Burada slaytta gördüğünüz iki URL bu rotayla eşleşecek.
İlki id segmentine sahip değildir ve ikincisi buna sahiptir.
Ancak segment isteğe bağlı olarak tanımlandığından, bu rota için her iki istekle de bir eşleşme yapacağız.
Segmentin gerçek içeriğini kontrol etmek de mümkündür.
URL'yi eşleşmeye dönüştüren herhangi bir değeri kısıtlamak için kısıtlamalar koyabiliriz.
Son bölümler için şimdi int ekledim.
Kısıtlama kısmı aslında int kısmıdır, yani kolondan sonraki kısımdır.
Kısıtlamalar şimdi yürürlükte iken,
son segment bir tamsayı değeri değilse veya bire geçirilemezse bir eşleşme olmayacaktır.
Kullanıcının gezinebilmesi için, tıklandığında isteği sunucuya gönderecek ve
daha sonra baktığımız şekilde yönlendirme sistemi tarafından işlenecek doğru bağlantıya sahip olmamız gerekir.
Bu bağlantıları kendimiz oluşturmamıza veya yazmamıza gerek yok.
Uygulamada tanımladığımız rotalara bağlı olarak, ASP.NET Core MVC doğru bağlantıları oluşturacaktır.
Bu temelde, diyelim ki, yönlendirme motorunun ikinci görevi olan bağlantılar oluşturmaktır.
Temel olarak, bir HTML yardımcısı (HTML Helper) HTML oluşturma sürecine katılır ve onu ilettiğiniz değerlere ve uygulamadaki bilinen rotalara bağlı olarak doğru bağlantıyı oluşturur.
Ancak HTML yardımcıları ileriye giden yol değildir.
Hala ASP.NET Core MVC'de çalışırken, artık etiket yardımcıları (Tag Helper) olarak adlandırılan yeni bir şeyimiz var.
Burada tam olarak aynı şeyi yapan bir etiket yardımcısı örneği görebilirsiniz.
Bir bağlantı oluşturacaktır.
Peki o zaman bir etiket yardımcısı tam olarak nedir?
View kodumuzda bir bağlantı oluşturmak için, ASP.NET Core MVC'nin ilk sürümüyle eklenen bir özellik olan Tag Helper ları kullanacağız.
Bir Tag Helper, sunucu tarafında çalıştıracak biçimlendirme kodundan oluşur.
İşaretleme kodumuzda kullandığımızda, kodun yürütülmesini tetikleyecektir.
Bu durumda, doğru bağlantının oluşturulması.
Bu şekilde, Razor kodu için belirli işlevlerin gerçekleşmesini tetikleyebiliriz.
MVC, yerleşik olarak epeyce etiket yardımcıları ile birlikte gelir
Özel etiket yardımcıları (custom tag helpers) oluşturmak da mümkündür.
Bunlar bir uzatma noktasıdır
etiket yardımcıları çoğunlukla önceki MVC sürümlerinden miras aldığımız HTML yardımcılarının yerini alıyor.
Bir etiket yardımcısı kullanmak, eski HTML yardımcılarına kıyasla çok daha temiz Razor HTML kodu sağlar.
Bu, ekibinizdeki HTML'yi Razor dosyalarınıza yerleştirmesi gereken tasarımcılar gibi kişiler için kesinlikle yararlı bir özelliktir.
etiket yardımcılarının açıklamasına başlamamın nedeni, onları gezinme için kullanacak olmamızdır.
Burada gördüğünüz kod parçasına bir göz atın.
Düz bir bağlantı etiketi, bir etiket kullanarak bir bağlantı oluşturuyorum.
ASP.NET Core MVC'nin uygulamamda tanımladığım rotaya veya rotalara göre doğru bağlantıyı oluşturmasını istiyorum.
Bunu bir etiket yardımcısı kullanarak yapabilirim.
Aslında, iki öznitelik etiketi yardımcısı kullanmak.
asp-controller
etiketi pastaya ve asp-action
etiketi yardımcısı listeye ayarlanır.
Belirtildiği gibi, etiket yardımcıları kodun yürütülmesini tetikler.
Dolayısıyla bu view kodu çalışacağı zaman, uygulamamızdaki rotalara bakacak ve bunlara dayalı olarak doğru giden bağlantıyı oluşturacak kodu tetikleyecektir.
Daha sonra, az önce oluşturduğumuz bağlantı için oluşturulan kodu görebilirsiniz.
Uygulamada sahip olduğumuz rotalara bağlı olarak, etiket yardımcıları sayesinde doğru bağlantı oluşturulacaktır.
Bağlantı gerçekten şimdi pie denetleyicisindeki list eylemine gidecek.
Uygulamamıza genel olarak etiket yardımcıları için destek sağlamak için addTagHelper'ı çağırmamız gerekecek ve
bunu etiket yardımcıları kullanacağımız her görünüm dosyasında yapabiliriz, ancak daha iyi bir yol var.
Burada, ASP.NET Core MVC'nin tüm yerleşik etiket yardımcılarının yaşayacağı ad alanına geçerek addTagHelper'a bir çağrı eklediğim güncellenmiş görünüm view imports dosyasını görebilirsiniz. View Imports Dosyasında
Bu, tüm view larda tek seferde etiket yardımcıları kullanmama izin verecek.
Gezinme konusunda yapmamız gereken her şeyi kapsamak için, ASP.NET Core MVC 3 bazı ekstra etiket yardımcılarıyla birlikte gelir.
Ayrıca asp-route
ve ardından yıldız işaretini parametrenin adıyla, örneğin id ile değiştirebileceğimiz ve ardından değeri iletebileceğimiz yıldız etiketi yardımcısını da alacağız.
Ayrıca, ASP.NET Core MVC'yi ada göre belirli bir yol kullanmaya zorlamak için kullanılabilecek asp-route
tag helper'a da sahip olacağız.
Bir sunucudaki bir sayfaya göz atmanın geleneksel yolunu düşünürsek,
temelde olan şey, örneğin Final1 için bir istekte bulunmamızdır.
Örneğin, ASP.NET Web Forms bu yaklaşımı kullanır.
Web sunucusunda olan şey, sunucunun o dosyayı arayacağı ve bulunduğunda bu dosyanın istemciye geri gönderileceğidir.
Burada anlaşılması gereken önemli olan, isteğin nasıl ele alındığıdır.
Diskte fiziksel olarak var olan bir dosya için bir istek yapılır ve istendiğinde ve bu dosya bulunduğunda, o dosya daha sonra istemciye iade edilir.
ASP.NET Core MVC ile çalışırken işler tamamen farklı bir şekilde gerçekleşiyor.
MVC kullanırken, isteklerin bir controller daki action metotlarıyla işlendiğini unutmayalım.
Dolayısıyla, talep geldiğinde, MVC'nin artık isteği doğru controller daki doğru action la eşlemesi gerekecektir.
Sonunda döndürülen şey bir view, .cshtml ile biten bir dosya olsa da, URL etkili bir şekilde bir eylem yöntemini hedefliyor.
Uygulamamızda gelen talep ile fiziksel dosya arasında artık bir bağlantı yoktur.
ASP.NET Core MVC hangi controller ı ve hangi action u çağırması gerektiğini nasıl bilecek?
Cevap, yönlendirme (routing) adı verilen bir süreçtir ve yerleşik ASP.NET Core MVC ile birlikte gelir.
Bu nedenle, özünde, ASP.NET Core MVC'deki yönlendirme(routing) mekanizması, belirli bir URL için bir isteği uygulama içindeki bir uç noktaya eşleyen MVC'ye özgü bir özelliktir.
İşe yarıyor çünkü en başta istek kanalına middleware ekledik.
Startup sınıfının Configure yöntemine UseRouting ve UseEndpoints eklendi.
Peki, bu middleware bileşenleri (component) sayesinde, uygulamamızda routing sistemi etkinleştirildi.
ASP.NET Core MVC, rota bilgilerine dayalı olarak bağlantılar da oluşturabilir, bu nedenle, işlenen HTML'nin parçası olmayacak giden bağlantılar.
ASP.NET Core, yerleşik iki tür yönlendirme ile birlikte gelir:
1 kural tabanlı yönlendirme (convention‑based routing)
2 öznitelik tabanlı yönlendirme (attribute‑based routing).
Kural tabanlı yönlendirme (convention‑based routing) en çok MVC web uygulamaları için kullanılır ve bu uygulama da kullanacağımız şey budur.
Öznitelik tabanlı yönlendirme (attribute‑based routing) çoğunlukla API'ler için kullanılır,
Diğerlerinin yanı sıra, routing i etkinleştirmek için eklememiz gereken middleware bileşenlerinin adı değişti.
Bu nedenle, ASP.NET Core 2.1 kullanıyorsanız middleware ın farklı olduğunu da unutmayın.
Kullanacağımız kodun geri kalanı ASP.NET Core 2.1 ve ASP.NET Core 3'te aynıdır.
Öyleyse routing nasıl çalışır?
Routing, kulağa mantıklı gelebilecek rotalara dayanır.
Her yol bir URL kalıbıdır ve bir işleyiciye eşlenir.
MVC durumunda işleyici, controller daki eylemdir.
Rotalarımız için desen kullanabilmemiz, uygulamamız için olası tüm rotaları yazmak zorunda olmadığımız anlamına gelir.
Olacak olan şey, URL'lerin bu kalıplarla karşılaştırılması ve bir eşleşme bulunduğunda, aslında, ilk eşleşme bulunduğunda, bu modelin daha sonra ilgili eylemi tetiklemek için kullanılacağıdır.
Şu temel URL'ye bir göz atalım, bethanyspieshop.com/Pie/List.
Bu URL'ye baktığımızda, etkili bir şekilde birkaç parçadan oluştuğunu görebiliriz.
Ev sahibi (host), yani www.bethanyspieshop.com, hem Pie hem de List.
Bu parçalar, segmentler olarak bilinir.
Tipik olarak, ana bilgisayardan (host dan) sonraki ilk bölüm controller ı gösterecek ve ikinci bölüm action u gösterecektir.
Elbette bunu bir şekilde yönlendirme motoruna açıklamalıyız.