Asp.NET – URL Routing Mekanizması

Uzun süredir Web alanında Asp.NET MVC mimarisi üzerinde içerik yayınlıyoruz.Haliyle her ne kadar web mimarisinde yoğunluk olarak taraf değiştirmiş olsakta bu Asp.NET mimarisi üzerinde çalışmalarımızı komple saf dışı bıraktık anlamına gelmemektedir.Asp.NET MVC’de URL Routing alt yapısının Asp.NET mimarisinde nasıl yapıldığı hakkında bir dizi soru ve içerik talebi aldım.Aslında bu konu üzerinde internette zibilyon Türkçe kaynak olmasına ve bunlara yönlendirmeme rağmen hala bu istek ve soruların sonunun gelmemesi neticesinde bu içeriği oluşturmaya karar verdim.

Evet artık konuya giriş yapabiliriz.

Asp.NET projeleri tabiatı gereği QueryString mekanizmasıyla daha seri çalışmalar gerçekleştirebilmemize olanak sağlayan bir platformdur.Bunun yanında SEO ve kullanıcı dostu dediğimiz URL yapılarınıda oluşturmamıza yarayan URL Routing mekanizmasını devreye sokarak, Asp.NET projelerinde artı bir özellik olarak kullanabiliriz.

Şimdi örneklendirme amaçlı bir Asp.NET projesi açarak içerisine “Default.aspx” ve “Kitaplar.aspx” isimli iki adet sayfa oluşturuyorum.Buradaki maksat “Default.aspx” sayfasında belirli kitapları listelemek ve URL Routing mekanizması kullanarak SEO uyumlu linkler eşliğinde “Kitaplar.aspx” sayfasına yönlendirmek.

Öncelikle Global.asax dosyamızı açarak aşağıdaki metodu oluşturuyoruz.

    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RouteAdd(RouteTable.Routes);
        }

        //Oluşturduğumuz metod
        void RouteAdd(RouteCollection route)
        {
            route.MapPageRoute("KitapDetay", "Kitap/{KitapAdi}", "~/Kitaplar.aspx");
        } 
    }

Şimdi burada biraz konuşalım.”RouteAdd” ismi verdiğim metod(ki bu metoda siz istediğiniz ismi verebilirsiniz) RouteCollection tipinden bir parametre almaktadır.RouteCollection tipi sayesinde biz projemizde yönlendirme yapacağımız şablonları tutmaktayız.

Şimdi bu metod içeriğini aşağıya alalım.

            route.MapPageRoute("KitapDetay", "Kitap/{KitapAdi}", "~/Kitaplar.aspx");

RouteCollection parametresinin “MapPageRoute” metodu ile URL şablonlarımızı belirtebiliyoruz.Tabi yukarda vermiş olduğumuz şablonun prototibini çizmemiz gerekirse aşağıya göz atınız.

route.MapPageRoute(“Şablon İsmi”, “URL Şablonu”, “Şablonun Uygulanacağı Sayfa”);

Evet, gördüğünüz gibi URL şablonumuzu oluşturmuş olduk.Şimdi Asp.NET işlemlerini hızlı bir şekilde halledip, bu URL Routing şablonunu linklemede nasıl kullanacağımızı görelim.

//Kitap Entitymizi oluşturdum.
    class Kitap
    {
        public string KitapAdi { get; set; }
    }
//Default.aspx komutları
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                List<Kitap> Kitaplar = new List<Kitap>();
                Kitaplar.Add(new Kitap { KitapAdi = "İstanbul Hatırası" });
                Kitaplar.Add(new Kitap { KitapAdi = "Büyük Oyun" });
                Kitaplar.Add(new Kitap { KitapAdi = "Ejderha Dövmeli Kız" });
                Kitaplar.Add(new Kitap { KitapAdi = "Nadir Şah" });
                Kitaplar.Add(new Kitap { KitapAdi = "Zihin Kontrolü" });
                Kitaplar.Add(new Kitap { KitapAdi = "Bir Savaş Nasıl Kaybedilir" });

                rptSaydir.DataSource = Kitaplar;
                rptSaydir.DataBind();
            }
        }
    }

Şimdi .aspx dosyamızı düzenleyelim.

            <asp:Repeater ID="rptSaydir" runat="server">
                <ItemTemplate>
                    <a href="/Kitap/<%#Eval("KitapAdi") %><a href="https://www.gencayyildiz.com/blog/wp-content/uploads/2015/12/Asp.NET-URL-Routing-Mekanizması.png"><img src="https://www.gencayyildiz.com/blog/wp-content/uploads/2015/12/Asp.NET-URL-Routing-Mekanizması.png" alt="Asp.NET - URL Routing Mekanizması" width="420" height="149" class="aligncenter size-full wp-image-3426" /></a>"><%#Eval("KitapAdi") %></a><br />
                </ItemTemplate>
            </asp:Repeater>

Şimdi burada dikkat edelim.Global.asax dosyamızda uyguladığımız şablon tipine benzer şekilde bir link yapısı oluşturuyoruz.Oluşturduğumuz bu link yapısı neticesinde URL Routing mekanizması devreye girecek ve bu yapıya benzer olan Route şablonunu bularak, belirlenen sayfaya yönlendirecektir.

Haliyle projeyi bu şekilde derleyip çalıştırırsak eğer aşağıdaki gibi bir sonuçla karşılaşacağız.
Asp.NET - URL Routing Mekanizması

Gördüğünüz gibi şablonumuza uygun URL yapısını oluşturmuş olduk.

Evet, şuanda duyuyorum ki “ya hocam linklerde boşluk karakterleri oldu mu şimdi” gibisinden şikayetler yağmaya başladı.Birazdan bunun çaresine de bakacağız lakin şimdi linke tıklandığı zaman “Kitaplar.aspx” sayfasından URL Roting mekanizması aracılığıyla gelen(QueryString değeriymiş gibi düşünebilirsiniz) parametre değerini nasıl elde ediyoruz görelim.

    public partial class Kitaplar : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (RouteData.Values["KitapAdi"] != null)
            {
                Response.Write(RouteData.Values["KitapAdi"]);
            }
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer aynı Asp.NET MVC mimarisinde olduğu gibi RouteData.Values komutu aracılığıyla adres çubuğundaki tüm parametre değerlerine erişebiliyor ve değerlerini elde edebiliyoruz.

Unutmayın ki, RouteData.Values Routing mekanizmasındaki parametre değerlerini tutar.

Asp.NET - URL Routing Mekanizması - 2

Şimdi ise URL yapısındaki boş karaktere çözüm bulalım.Bunun için çok şaşalı bir işlem yapmayacağız.Bir static metod ile parametreye gönderilecek olan değeri alıp, istenmeyen karakterleri istediklerimizle değiştirmemiz yeterlidir.

    public static class KarakterDuzenleyici
    {
        public static string Duzenle(string Metin)
        {
            Metin = Metin.Replace(" ", "-");
            Metin = Metin.Replace("ö", "o");
            Metin = Metin.Replace("İ", "i");

            return Metin;
        }
    }

Yukarıdaki kod bloğunda gördüğünüz gibi bir static metod oluşturdum.Bu metoda göndereceğimiz metinsel ifade bize istemediğimiz karakterlerden arındırılmış bir vaziyette geri gelecektir.Tabi ben örneği uzatmamak kaydıyla kısa tuttum.Siz istediğiniz şekilde geliştirebilirsiniz.

            <asp:Repeater ID="rptSaydir" runat="server">
                <ItemTemplate>
                    <a href="/Kitap/<%#AspNETRouting.KarakterDuzenleyici.Duzenle(Eval("KitapAdi").ToString()) %>"><%#Eval("KitapAdi") %></a><br />
                </ItemTemplate>
            </asp:Repeater>

Repeater nesnemiz içerisinde oluşturduğumuz linkin Eval kısmını yukarıdaki gibi güncelledikten sonra projemizi derleyip çalıştıralım…
Asp.NET - URL Routing Mekanizması - 3

Eveet…

Artık Asp.NET mimarisinde URL Routing mekanizmasının nasıl uygulandığını detaylıca irdelemiş olduk.Ama burada noktalandırmadan önce ben diyorum ki madem bu işe el attık tam tamına akıllarda soru işareti bırakmayalım.

URL Roting sonucunda oluşturduğumuz linklerin sonuna “.html” uzantısını nasıl ekleyeceğimizi göstermek istiyorum.
Bu işlem için URL Routing şemamızda bir güncelleştirme yapmamıza gerek yok.Şemaya uygun link kalıbını bastığımız noktaya giderek, link sonuna .html eklememiz yeterli olacaktır.

            <asp:Repeater ID="rptSaydir" runat="server">
                <ItemTemplate>
                    <a href="/Kitap/<%#AspNETRouting.KarakterDuzenleyici.Duzenle(Eval("KitapAdi").ToString()) %>.html"><%#Eval("KitapAdi") %></a><br />
                </ItemTemplate>
            </asp:Repeater>

Gördüğünüz gibi “.html” uzantısını oluşturulacak linkin sonuna ekledim.Bu şekilde projemizi derleyip çalıştırırsak eğer,
Asp.NET - URL Routing Mekanizması - 4
ekran görüntüsünde gördüğünüz gibi linklerimiz sorunsuz oluşturalacaktır.

Lakin…!!!

Linke tıkladığım zaman karşınıza aşağıda ekran görüntüsündeki hata gelebilme olasılığı yüksektir.
Asp.NET - URL Routing Mekanizması - 5

Bu hatanın sebebi linkinizdeki “.html” uzantısıdır.IIS’in uzantılı linkleri tanımlayıp çalıştırabilmesi için web.config dosyasında bir düzenleme yapmamız gerekmektedir.

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>

Yukarıdaki komutu web.config dosyasına entegre etmeniz bu hatadan sizi kurtaracaktır.
Örnek web.config için aşağıdaki kod bloğunu inceleyiniz.

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.6"/>
    <httpRuntime targetFramework="4.6"/>
  </system.web>
  <!-- ................. -->
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <!-- ................. -->
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>
</configuration>

Bu şekilde projemizi derleyip çalıştırdığımız zaman sıkıntısız çalışacaktır.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar dilerim…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Fatma dedi ki:

    İyi günler yazınız çok işime yaradı çok çok teşekkür ederim. Fakat birşey merak ediyorum. Mesela menüde de anasayfaya tıkladığımızda http://www.domain.com/Anasayfa şeklinde değilde sadece http://www.domain.com şeklinde gözükmesi için ne yapmam gerekiyor? Şimdiden çok teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir