Makale Özeti

Bu makalemde sizlere Url ReWriter Path konusundan bahsedeceğim. Türkçe karşılığı nedir bende tam olarak bilmiyorum ama url adlandırma şeklinde çevirsek çok kaba olmaz sanırım :)

Makale

Bu makalemde sizlere Url ReWriter Path konusundan bahsedeceğim. Türkçe karşılığı nedir bende tam olarak bilmiyorum ama url adlandırma şeklinde çevirsek çok kaba olmaz sanırım :) Son zamanlarda sıkça karşımıza çıkan bir durum internet sitelerinde.

En basit örneği kendi Kişisel web sayfamdan göstereyim. www.gokhanbagci.info/Articles/19-il-ilce-semt-veritabani-sql-server-2005.aspx şeklinde sayfa isimleri görüyoruz browserımızın adres çubuğunda, aslında böyle bir sayfa yok! Ama biraz sonra global.asax dosyamız içerisinde yazacağımız  kodlarla bunu arka planda detay.aspx?ID=19 şekline çevireceğiz. Böylelikle arka planda detay.aspx çalışacak ama kullanıcılar yeniden adlandırdığımız sayfa isimlerini görecek.

Hoş arka planda madem böyle çalışacak neden bu kadar uğraşacağız derseniz tabii ki bir sebebi var :) Arama motorları sayfalarımızı indekslerken bizim adlandırdığımız şekilde kayıtları tutacak. Buda daha sonra yapılan arama sorgularında daha başarılı sonuçlarla, daha öncelikli olarak listelenmesini sağlayacaktır.
Not: Arama sonuçlarında her zaman sayfa url’leri başlık ve içeriğe göre daha fazla öncelik sağlar.

Gelelim örnek veritabanımızı ve kodlarımızı yazmaya...



Image2.jpg

Veritabanımızı oluşturduktan sonra projemize bir adet global.asax dosyası ekliyoruz. Daha sonra “Makale” isminde bir klasör ve içerisinede Detay.aspx isminde bir sayfa ekliyoruz. Listelemek içinde ana root’taki Default.aspx sayfasını kullanacağız. Sırasıyla Global.asax, Default.aspx ve Detay.aspx kodlarını yazmaya başlayalım.

Global.asax


<%
@ Application Language="C#" %>
<script runat="server">
    void Application_BeginRequest(Object sender, EventArgs e)
    {
        //İşlemleri yapacağımız sayfanın url bilgisini alıyoruz...
        //Ör: /Makale/19-il-ilce-semt-veritabani-sql-server-2005.aspx      
        string DosyaYolu = Request.RawUrl;
        //IndexOf ile url bilgisinde Makale klasörünün geçip geçmediğini kontrol ediyoruz,
        //Bu kontrolü yapmazsak tüm dosyalarda ReWriter işlemi yapmaya çalışacaktır...
        if (DosyaYolu.IndexOf("/Makale/") != -1)
        {
            //Bu kısımda uzantıyı html olarak belirledik, isterseniz aspx, rss, xml gibi
            //uzantılarıda kullanabilirsiniz. Hatta kendi belirlediğiniz uzantılarıda yazabilirsiniz.
            if (System.IO.Path.GetExtension(DosyaYolu) == ".html")
            {
                //Bütün kontrolleri aştıktan sonra bu kısımda MakaleID 'sini alacağız...
                //Split ile url'yi dize haline getirip 19 sayısına ulaşacağız.
                string[] path = System.IO.Path.GetFileName(DosyaYolu).Split('-');
                //İlk parametrede gerçek sayfa pathini, daha sonra MakaleID'yi gönderiyoruz...
                Context.RewritePath("~/Makale/Detay.aspx", "", "MakaleID=" + path[0], true);
            }
        }
    }
</script>
 

Default.aspx


<
asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <li><asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# ReWriterPath(Eval("MakaleID").ToString(), Eval("Baslik").ToString()) %>'><%#Eval("Baslik") %></asp:HyperLink></li>
    </ItemTemplate>
</asp:Repeater>
 

Default.aspx.cs


protected
void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        SqlConnection con = new SqlConnection("Server=E6750; Database=ReWriter; Trusted_Connection=True;");
        //Veritabanımızdan eklediğmiz makaleleri çekip Repeater'ımıza ekliyoruz...
        SqlDataAdapter da = new SqlDataAdapter("Select * From Makaleler", con);
        DataTable dt = new DataTable();
        da.Fill(dt);
        Repeater1.DataSource = dt;
        Repeater1.DataBind();
    }
}

public string ReWriterPath(string MakaleID, string Baslik)
{
    string Temp = "";
    //Bu kısımda çeşitli replace işlemleri yapacağız çünkü adres çubuğunda
    //geçerli olmayan karakterler karşımıza çıkacaktır Ör: ğşü# vs...
    //ve url'yi daha anlamlı hale getirmek için bunları replace etmeliyiz...
    Temp = Baslik.ToLower();
    Temp = Temp.Replace("-", ""); Temp = Temp.Replace(" ", "-");
    Temp = Temp.Replace("ç", "c"); Temp = Temp.Replace("ğ", "g");
    Temp = Temp.Replace("ı", "i"); Temp = Temp.Replace("ö", "o");
    Temp = Temp.Replace("ş", "s"); Temp = Temp.Replace("ü", "u");
    Temp = Temp.Replace("\"", ""); Temp = Temp.Replace("/", "");
    Temp = Temp.Replace("(", ""); Temp = Temp.Replace(")", "");
    Temp = Temp.Replace("{", ""); Temp = Temp.Replace("}", "");
    Temp = Temp.Replace("%", ""); Temp = Temp.Replace("&", "");
    Temp = Temp.Replace("+", ""); Temp = Temp.Replace(".", "-");
    Temp = Temp.Replace("?", ""); Temp = Temp.Replace(",", "");
    return "Makale/" + MakaleID + "-" + Temp + ".html";
}
 

Detay.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        //Normalde path 19-aspnet-ile...aspx gibi görünüyor,
        //Ama global.asax ile arka planda path'i değiştirdiğimiz için
        //Request.QueryString["MakaleID"] bize 19 değerini döndürecektir...
        string MakaleID = Request.QueryString["MakaleID"].ToString();
        //Daha sonra bu id'ye göre işlemlerinizi yapabilirsiniz...
        //Aşağıdaki kodlarda kabaca makale detaylarını sayfaya yazdırıyorum...
        SqlConnection con = new SqlConnection("Server=E6750; Database=ReWriter; Trusted_Connection=True;");
        SqlDataAdapter da = new SqlDataAdapter("Select * From Makaleler Where MakaleID=@MakaleID", con);
        da.SelectCommand.Parameters.AddWithValue("@MakaleID", MakaleID);
        DataTable dt = new DataTable();
        da.Fill(dt);
        Response.Write("<b>MakaleID</b>: " + dt.Rows[0]["MakaleID"].ToString() + "<br>");
        Response.Write("<b>Başlık</b>: " + dt.Rows[0]["Baslik"].ToString() + "<br>");
        Response.Write("<b>İçerik</b>: " + dt.Rows[0]["Icerik"].ToString() + "<br>");
    }
}

Ve sırasıyla ekran çıktılarımıza göz atalım…



Global.asx ile ReWriter Path linkine tıklayoruz ve aşağıdaki gibi sonuca ulaşıyoruz...


Path konusunda daha farklı adlandırmalarda yapabiliriz. Ör: /global-asax-ile-rewriter-path/1.aspx gibi... Bu şekilde yapmış olsaydık global.asax dosyamızda IndexOf yerine split “/” ile parçalara bölüp path sayısına göre adlandırma işlemini yapabiliriz.

Başka bir makalemde görüşmek dileğiyle...

Gökhan BAĞCI
Microsoft Certified Professional