Asp.NET – URL Routing Mekanizması

Asp.NET projeleri tabiatı gereği QueryString mekanizmasıyla daha seri çalışmalar gerçekleştirebilmemize olanak sağlayan bir platformdur.

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");

Kodların açıklaması aşağıdaki gibi.

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

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.

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(newKitap { KitapAdi = "İstanbul Hatırası" });
      Kitaplar.Add(newKitap { KitapAdi = "Büyük Oyun" });
      Kitaplar.Add(newKitap { KitapAdi = "Ejderha Dövmeli Kız" });
      Kitaplar.Add(newKitap { KitapAdi = "Nadir Şah" });
      Kitaplar.Add(newKitap { KitapAdi = "Zihin Kontrolü" });
      Kitaplar.Add(newKitap { 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="http://www.gencayyildiz.com/blog/wp-content/uploads/2015/12/Asp.NET-URL-Routing-Mekanizması.png">
        <img src="http://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>

Sonraki yazılarımda görüşmek üzere… Bu şekilde projemizi derleyip çalıştırdığımız zaman sıkıntısız çalışacaktır.

İyi çalışmalar dilerim…

Metin Cengiz

Metin Cengiz
2007 yılında yazılım ile tanıştıktan sonra yaşamında yeni farkındalıklar ve heyecanlar yaratmak için hayatına yazılım sektöründe yön verdi.Çukurova Üniversitesi bilgisayar mühendisliğini bitirdikten sonra çeşitli firmalarda yazılım geliştirme uzmanlığı yapmıştır.Genellikle web servisler üzerine çalışmalar yaparak asp.net ile linux entegreli yazılımlar geliştirmiş,aynı zamanda .net tabanlı online telefon araması yapan ve çeşitli firmalarda kullanılan anket yazılımı yapmıştır.Sürekli yeni freameworkler kullanarak az kod-çok iş mantığını benimsemiştirwink. Metin bilgilerini güncel tutmak, yeni teknolojileri öğrenmek ve öğretmek için sürekli blog sitesinde paylaşım yapar. “Yaşamın içindeki diğer insanlar içinde yoksak ve onlara anlamlar yükleyemiyorsak, paylaşmıyor, dönüştürmüyor ve katmıyorsak, katılmıyorsak yaşamın anlamı yoktur.” {Metin Cengiz}
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Hocam dediğinizde haklısınız. İnternette binlerce sayfa var ama çoğu yarım yamalak anlatmış. Bu işlem benim korkulu rüyalarımdan biriyle ne kadar çok denesemde bir türlü başarıya ulaşamamıştım. Bu akşam deneyeceğim bu anlattıklarınızı umarım başarabilirim :) Üstün körü anlatımdan nefret ederim. Eğer bir şey anlatılacaksa ayrıntılı bir şekilde anlatılmalıdır. Ayrıntılı anlatılmayacaksada yeni başlayanlara uygun değildir gibi bir uyarı yapılması gerek diye düşünüyorum. Bu makalenizi okuduğumda çok kolay bir şekilde anladım. Çok teşekkürler.

Yukarı Git