url re-writing.net ile form sayfalarını post back yaparken karşılaşılan sorun, alınan hata mesajı

Asp.net ile hazırlamış olduğunuz web sitesinde arama motorları için seo yapmanız gerektiğinde kullandığınız üçüncü parti bazı dll kütüphaneleri hayatı sizin için çıkılmaz bir hale sokabiliyor. Bu dll'lerden biri UrlRewritingNet.UrlRewriter.dll 'dir. Sayfanın url'i seo için güzel bir şekilde görünürken, hazırlamış olduğuz bir web formundaki butonu submit edip tetiklediğinizde formun çalışmadığını ve hata aldığını görürsünüz. Sebebine bakmak istediğinizde sayfanın kaynak kodunda

<form>

etiketi içindeki action attribute değerinin boş olduğunu görürsünüz. 
Bu durumu düzeltmek için App_Browsers klasörünü projenize dahil edip içine Form.browser adında bir dosya oluşturun. Dosyanın içine aşağıdaki satırları ekleyin

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType="MyClasses.FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

Daha sonra App_Code klasörü altında FormRewriter.cs sınıfını oluşturun. Aşağıdaki kod blokunu sınıf dosyasının içine ekleyin.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;

namespace MyClasses {
    public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter {
        protected override void Render(System.Web.UI.HtmlTextWriter writer) {
            base.Render(new RewriteFormHtmlTextWriter(writer));
        }
    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter {
        public RewriteFormHtmlTextWriter(System.Web.UI.HtmlTextWriter writer) : base(writer) {
            this.InnerWriter = writer.InnerWriter;
        }

        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer) : base(writer) {
            base.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode) {
            // If the attribute we are writing is the "action" attribute, and we are not on a sub-control,
            // then replace the value to write with the raw URL of the request - which ensures that we'll
            // preserve the PathInfo value on postback scenarios

            if (name == "action") {
                HttpContext context = HttpContext.Current;
                if (context.Items["ActionAlreadyWritten"] == null) {
                    // Because we are using the UrlRewriting.net HttpModule, we will use the
                    // Request.RawUrl property within ASP.NET to retrieve the origional URL
                    // before it was re-written. You'll want to change the line of code below
                    // if you use a different URL rewriting implementation.

                    value = context.Request.RawUrl;

                    // Indicate that we've already rewritten the <form>'s action attribute to prevent
                    // us from rewriting a sub-control under the <form> control

                    context.Items["ActionAlreadyWritten"] = true;
                }
            }
            base.WriteAttribute(name, value, fEncode);
        }
    } 
}


Daha sonra formunuz post ettiğiniz sayfanın code-behind kısmına page.valid kontrolünü ekliyoruz.

 if (Page.IsValid)
        {
        //kodunuz...
        }

Böylece sayfanız sorunsuz bir şekilde url.rewriting ile yapmış olduğunuz postbacki çalıştırıp, gerekli validation işlemlerini forma uygulayabilecektir.

Yorumlar

Bu blogdaki popüler yayınlar

22.06.2020 - 26.06.2020 arası işler

Asp.net RestSharp ile data post etmek

List Box Item içindeki elemanları aşağı veya yukarı taşımak