Showing posts with label preserve original url after post back. Show all posts
Showing posts with label preserve original url after post back. Show all posts

Monday, April 6, 2009

URL rewriting / mapping in ASP.Net

URL rewriting or mapping is an important feature of a web application, by which you can give search engine friendly URLs in your application and provide extra security to your application.

following is very simple approach, how to do that-

1) You need to add following section in your Web.config


<system.web>
<urlMappings enabled="true">
<add url="~/fakename.aspx" mappedUrl="~/actualpageurl.aspx" />
<add url="~/Registration.aspx" mappedUrl="~/signup.aspx" />
</urlMappings>
</system.web>


2) Add ASp.Net folder "App_Browsers" in your application







3) Add a new item in that folder as "Form.browser"

Code- Form.browser

<browsers>

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

</browsers>




4) Create a class file as follows

//Form.cs

using System;
using System.Web.UI;
using System.Web;

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(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 = default(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);

}
}


5) Thats all and you are ready to rewrite your incoming URLs without any complex code for HTTP-module
and any actionless form.


IMPORTANT: If you go for Actionless form then it has a side effect that disables page validators.

if this was helpful then please donate as much you want



Cheers