ASP.NET MVC – Proje, Yönlendirme
Giden(Üretilen) URL’ler
Şimdiye kadar öğrendiklerimizle çok büyük siteler için bile url şablonları hazırlayabiliriz. Url yönelndirmenin en güzel tarafı, giden yani üretilen url’ler için ek bir çaba sarf etmememizdir. Yani ilk başta url şablonlarını hazırlayıp MapRoute metodu ile sisteme tanıtıyoruz ve üretilen url’ler bu şablonlara uygun oluyor.
Url şablonları url üretmek için bir avantaj olması ile birlikte bu avantajı kullanabilmek için statik url kullanımı yerine url üretimini tercih etmeliyiz. Yani aşağıdaki gibi link oluşturmaktan şiddetle kaçınmalıyız:
<a href="Home/Index">Ana Sayfa</a>
Çünkü bu tarz statik linkler oluşturduğumuzda, her url şablonunun değişiminde bu tarz url’leri el ile değiştirmek zorunda kalırsınız. Ya da Home controller’ın route ismini değiştirdiğinizde yine bu linki el ile değiştirmeniz gerekir. Tek bir link için el ile değiştirmek belki basittir, fakat sitede binlerce link olduğunu farz edin. Bu yüzden url üretimi önemli bir noktadır.
Aşağıdaki url şablonunu ele alalım:
routes.MapRoute(null, "{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
Basit bir html linki oluşturmak için Html.ActionLink yardımcı metodunu çağırıyoruz. View dosyası içinde herhangi bir yerde:
@Html.ActionLink("Yardım Sayfası", "Help")yazdığımızda html çıktısı şöyle olacaktır:
<a href="/Home/Help">Yardım Sayfası</a>
Velevki url şablonunu şu şekilde değiştirmek istedik:
"AnaSayfa/View{action}"Bu durumda Html.ActionLink metodunda herhangi bir değişiklik yapmamıza gerek kalmaz. Çünkü url şablonu değiştiğinde Html.ActionLink ve benzeri yardımcı metodlar geçerli olan url şablonuna göre html çıktısı üretecektir. Yukarıdaki url şablonu için html çıktısı şöyle olacaktır:
<a href="/AnaSayfa/ViewHelp">Yardım Sayfası</a>
Gelen url isteklerinde olduğu gibi url üretiminde de url şablonlarından kriterimize uygun ilk şablon kullanılacaktır. Yani en uygun şablonu bulmak yerine kriterimize uygun ilk şablon url üretiminde kullanılacaktır. Bu nedenle çok özel url şablonlarınızı en başta tanımlamalısınız. Eğer url üretiminde herhangi bir eşleşen şablona rastlanmazsa ActionLink metodu ile üretilen linkin href özelliği boş olacaktır.
Bu örnekte ActionLink ile view dosyasına bağlı olan controller nesnesinden bir action linki tasarladık. Başka bir controller nesnesinden bir action metod’a link vermek istediğimizde bir parametre daha eklememiz gerekmektedir:
@Html.ActionLink("İletişim", "Index", "Contact");
Bu örnekte Contact controller sınıfdaki Index metodu için link üretilecektir.
Bununla birlikte sistem, üretmek istediğiniz url’nin varsayılan değerlerini de url üretimine dahil etmeyecek kadar akıllıdır. Yani:
@Html.ActionLink("Ana Sayfa", "Index", "Home");
şeklinde varsayılan değerleri isteyen bir url üretmek istediğimizde varsayılan değerler atılarak sonuç en kısa haliyle bize sunulur yani:
<a href="/">Ana Sayfa</a>
Segment Parametrelerini Belirlemek
ActionLink metoduna girdiğimiz parametrelerin url şablonunda controller ve action değişkenlerine karşılık geldiğini biliyoruz. Bunun dışında tanımladığımız diğer url değişkenleri için de parametre belirleyebilirsiniz. Bunun için metoda bir parametre daha ekleyeceğiz.
@Html.ActionLink("İletişim", "Index", "Contact",
new {id = "UserId"});
Bu kodun çıktısı şu şekilde olacaktır:
<a href="/Contact/Index/UserId">İletişim</a>
Daha önceden tanımladığımız url şablonundaki “id” isimli değişkene burada “UserId” gibi bir değer atıyoruz. Eğer url şablonunda olmayan fazladan bir parametre atarsak, bu parametre query string olarak url’ye eklenecektir. Yani:
@Html.ActionLink("İletişim", "Index", "Contact",
new {id = "UserId", extra = 15});
Bu kodun çıktısı şu şekilde olacaktır:
<a href="/Contact/Index/UserId?extra=15">İletişim</a>
Gördüğünüz gibi extra değişkeni url şablonunda bulunmuyor, fakat istediğimiz url, url şablonumuza uyuyor. Bu durumda bu şablon kullanılarak sonuna extra değişkeni ile bir query string oluşturuluyor.
Url Üretim Sistemi
Yönelendirme sistemini daha etkin bir şekilde kullanmak istiyorsak, url’lerin üretimi ardındaki mantığı iyi kavramamız gerekmektedir. Üretilecek olan url’miz ile eşleşecek olan yönlendirme bulunurken, sistem url şablonlarındaki segment isimleri ile bizim girdiğimiz parametre isimlerini karşılaştırır. Bununla birlikte her yönlendirmede kullanılan kısıtlamalar da bu eşleşmenin gerçekleşip gerçekleşmeyeceği noktasında söz sahibidirler.
ActionLink gibi bir metodun parametreleri ile url şablonundaki segment isimleri karşılaştırılırken, yönlendirme sistemi ilk olarak mevcut gelen isteğe bakar. Yani ActionLink gibi bir metod ile url üretmeye kalktığımızda sistem, segmentlerden önce, ilk olarak mevcut url isteğini hesaba katar. Şu şablona bir göz atalım:
routes.MapRoute(null, "{controller}/{action}/{tema}/{sayfano}");Bu yönlendirme etkin iken kullanıcı “http://www.diyezon.com/Home/Index/SiyahTema/5″ url’sini istedi. Yönlendirme sistemi de haliyle bu yönlendirme sistemini gerçekleştirdi ve ilgili action metodu çalıştırdı. Tabi bu url ile beraber tema değişkeni SiyahTema değerini sayfano ise 5 değerini aldı.
Şimdi halen bu url ile istenen sayfada olduğumuzu düşünelim. View dosyamızda aşağıdaki gibi bir link oluşturuyoruz:
@Html.ActionLink("Sonraki Sayfa", "Index", "Home", new {sayfano=6})
İlk aklımıza gelen şey, “tema” değişkenini belirtmediğimizden bu metodun yönlendirme sisteminde bir karşılığı olmadığı olacaktır. Çünkü önceden de bahsettiğimiz gibi url üretiminde segment isimleri ile parametreler eşleşmelidir. Fakat biz burada tema değişkenini belirtmedik, bu yüzden ilk akla gelen şey eşleşmenin sağlanamayacağı ve üretilecek olan linkin boş olacağı yönündedir. Fakat bu sayfayı ziyaret ettiğimizde üretilen linkin aşağıdaki gibi olacağını görürüz:
<a href="/Home/Index/SiyahTema/6">Sonraki Sayfa</a>
Gördüğünüz gibi tema değişkenini belirtmediğimiz halde yönlendirme sistemi ilk başta belirttiğimiz url şablonu ile eşleşme sağladı ve linki üretmeyi başardı. Bunun sebebi, mevcut url ile beraber önceden tema değişkenine SiyahTema atanmış olmasıdır. Yani kullanıcı “…/SiyahTema/5″ şeklinde url istemesiyle, bizim tema değişkenimiz SiyahTema olacaktır. Yönlendirme sisteminin tek yaptığı, belirtilmese dahi, bu değeri tekrar kullanmak olacaktır.
Fakat acele etmeyin. Şimdi başka bir şey deneyelim. Diyelim ki yine “…../SiyahTema/5″ url adresindeyiz. Ve yine aşağıdaki gibi bir url üretmeye çalışıyoruz:
@Html.ActionLink("Sonraki Sayfa", "Index", "Home", new {tema="MaviTema"})
Bu kez sayfano değişkeni yerine tema değişkenini belirttik ve sayfano değişkenini göz ardı ettik. Bu durumda düşündüğümüzün aksine önceki belirttiğimiz tekrar kullanım olayı gerçekleşmeyecek, url eşleşmesi olmayacaktır ve üretilen url boş olacaktır. Çünkü yönlendirme sistemi sadece önceki segment değerleri için tekrar kullanımı devreye sokacaktır.
Her ne kadar tekrar kullanım özelliği önceki segment değerlerini girmemenizi sağlasa da bu özelliği fazla kullanmamanızı tavsiye ediyorum. Çünkü kodlara tekrar dönüp baktığınızda linkin nereye verildiğinin anlaşlıması zor olabilir. Ayrıca son örnekteki gibi hatalar da gerçekleşebilir. Siz en iyisi tüm segment parametrelerini belirtin.
Html Özelliklerini Belirlemek
Sonuçta çıktı olarak html üretiyoruz. Bu yüzden yeri geldiğinde bu linkin html özelliklerini de belirtmemiz gerekbilir.
@Html.ActionLink("Ana Sayfa", "Index", "Home", null,
new {id="linkID", @class="cssClass"})
<a href="/" id="linkID" class="cssClass">Ana Sayfa</a>
Gördüğünüz gibi ek segment parametrelerini null belirttik yani parametre girmedik. Sonraki parametrede ise yine bir anonim nesne oluşturduk ve içinde “a” html tag’ına ait özellikleri belirttik. “class” ifadesi, c#’da ayrılmış bir kelime olduğu için başına “@” işareti koyduk.
ActionLink metodunun bunlar dışında başka overload versiyonları da vardır. Mesela üretilen url’nin domain kısmını belirtebilir ya da http yerine https ekleyebilirsiniz.
@Html.ActionLink("Ana Sayfa", "Index", "Home", null,
"https", "en.diyezon.com", "anchor"
new {id="linkID", @class="cssClass"})
<a href="https://en.diyezon.com/Home/Index#anchor" id="linkID" class="cssClass">Ana Sayfa</a>
Burada ActionLink metoduna ait tüm overload versiyonları incelememiz biraz zor. Geri kalanını intellisense yardımı ile çözebilirsiniz.
Link Yerine Url Üretmek
ActionLink metodu ile bir html linki oluşturuyorduk. Eğer sadece url’yi üretmek istersek Url.Action metodunu kullanmalıyız:
İletişim Sayfasının urlsi: @Url.Action("Index", "Contact");
Bu kodların html çıktısı:
İletişim Sayfasının urlsi: /Contact/Index
olacaktır.
Parametreler ActionLink ile aynı olduğundan burada tekrar bahsetmeyeceğiz.
İsimlendirilmiş Yönlendirmeler
Şimdiye kadar hazırladığımız tüm yönlendirmelere isim olarak null girdik. Fakat özel bazı yönlendirmelere isim atayarak url üretiminde sadece o yönlendirmenin kullanılmasını talep edebiliriz.
İsimlendirilmiş yönlendirmeleri kullanmak için Html.RouteLink ve Url.RouteUrl yardımcı metodlarını kullanabiliriz. Tahmin edeceğiniz gibi Html.RouteLink ile bir html linki, UrlRouteUrl ile bir url stringi üretiyoruz.
routes.MapRoute("TemaRoute", "{controller}/{action}/{tema}");Bu yönlendirmemize “TemaRoute” ismini verdik. Ve sadece bu yönlendirmeyi kullanmak istersek şu şekilde yazıyoruz:
@Html.RouteLink("Siyah Tema Sayfası", "TemaRoute",
new {controller="Home", action="Index", tema="SiyahTema"});
@Url.RouteUrl("TemaRoute",
new {controller="Home", action="Index", tema="SiyahTema"});
Bu metodların ActionLink ve Url.Action metodlarından farkı, controller ve action değişkenlerini ayrı olarak anonim nesne içinde belirtmemizdir.
İsimlendirilmiş yönlendirmeler her ne kadar cazip bir özellik gibi görünse de tavsiye edilmeyen bir şeydir. Çünkü mevcut yönelendirme sisteminin “ilk yönlendirme en yüksek önceliklidir” kuralını kırmış olabilirsiniz. Bu durumda kullanıcı ürettiğiniz linke tıkladığında hiç ummadığı bir sayfa ile karşılaşabilir. Url yönlendirme sisteminizdeki hataları düzeltmek için isimlendirilmiş yönlendirmelere baş vurmayınız. Bunun yerine url şablonlarınızı bir daha elden geçirip daha uygun bir öncellik sıralaması oluşturun.
Bu haftalık da bu kadar. Yorumlarınızı bekliyorum. Klavyenize zeval gelmesin ![]()
Fatih Tolga Ata © 2011




Üff baya uzun olmuş. Kendim kaptırıp yazmaya başlayınca ne kadar yazdığımın farkına varmayabiliyorum
Umarım faydalı olmuştur.
Eline sağlık. ilgilenenlere arkadaşlara çok faydalı olacağını tahmin ediyorum. Flartoolkit ve PV3D için de makaleler bekliyoruz bu arada…
Rüyanda görürsün
Bizim de yapmanı beklediğimiz bazı şeyler var ama gecikmeye devam ediyor sanırım
Güzel bir makale elinize sağlık. Klasik yönlendirme asp.net de ki gibi.
Çok teşekkürler..
maşallah döktürmüşsün gene… bunların çıktısını alıp askerde okumayı düşünüyorum
hemde bir kaç defa… sana zahmet mvc hakkında yazmaya devam et çarşı izinlerine gelince bunları çıktıp alıp bölükte boş vakitlerde okuyayım…
teşekkrür ederim
Ellerinize sağlık.
Çok çok teşekkür ediyorum..