Click here to Skip to main content
Licence CPOL
First Posted 8 Apr 2007
Views 127,029
Downloads 1,168
Bookmarked 103 times

URL Mapping / URL Rewriting / Search Engine Friendly URLs / Virtual URLs (ASP.NET)

By | 20 Apr 2007 | Article
URL Mapping / URL Rewriting / Search Engine Friendly URLs / Virtual URLs with postbacks in ASP.NET C# (Without hardcoding in Web.Config)

Introduction

(ASP.NET, C#, Visual Studio 2005)

Hi folks; Recently, I built a custom Content Management Software for a website. The client wanted the page contents to be served from database by a page ShowContents.aspx?ContentID=XX.
The main requirements were as follows:

  • Search engine friendly URLs (i.e. They would like "/finance/loan.aspx" instead of "ShowContents.aspx?ID=23").
  • Hardcoding URLs in Web.Config's URLMapping section was not an option, as there were no physical pages to map to.
  • Postback should still work on all these virtual URLs.
  • References to the images, css files, and themes should stay intact.

Solution

After a day's research, I came up with this really simple solution. I thought I should sum up the knowledge collected from various sources and make it public for everyone to benefit.
You can integrate following steps in to your existing ASP.NET project, or you can create a new one.

STEP 1

  • Create "ShowContents.aspx", that serves content based on the ContentID passed in the QueryString.
  • To enable postbacks to the raw URL in the Page_Load() event of ShowContents.aspx, insert following line Context.RewritePath(Path.GetFileName(Request.RawUrl)); // needs System.IO

STEP 2

  • Capture the URL requested by the user in the Application_BeginRequest() event of Global.asax.
  • Find the ID of the content from database that is relevant to this URL
  • ReWritePath to ShowContents.aspx?ContentID=XX. The user will see requested URL in the address bar with the desired content.
  • Any files that physically exist on the server will still get served as usual.

Using the code

// STEP 1 (ShowContents.aspx)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// This page displays contents from a database for a ContentID. This file
// must contain the following line in it's Page_Load() event.
Context.RewritePath(Path.GetFileName(Request.RawUrl)); //needs System.IO

// STEP 2 (Global.asax)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Following code goes in your Global.asax file, in the root directory of
// the project. This file captures the incoming requests' URL, gets the 
// Content ID of the content related to the URL and redirects the user to
// ShowContents.aspx?ContentID=XX. While the user still sees the requested 
// URL in the address bar.

    <%@ Import Namespace="System.IO" %>
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        // If the requested file exists
        if (File.Exists(Request.PhysicalPath))
            { 
                // Do nothing here, just serve the file
            }
        // If the file does not exist then
        else if (!File.Exists(Request.PhysicalPath))
            {
            // Get the URL requested by the user
            string sRequestedURL = Request.Path.Replace(".aspx", "");
            
            // You can retrieve the ID of the content from database that is 
            // relevant to this requested URL (as per your business logic)
            int nId = 0;        
            ////// nId = GetContentIDByPath(sRequestedURL); \\\\\

           // The ShowContents.aspx page should show contents relevant to 
           // the ID that is passed here
            string sTargetURL = "~/ShowContents.aspx?ContentID=" + nId.ToString();

            // Owing to RewritePath, the user will see requested URL in the
        // address bar
            // The second argument should be false, to keep your references
        // to images, css files
            Context.RewritePath(sTargetURL, false);
        }
    }
//  That's all! :-) 
 

Hope this helps you save time on researching various sources. You might like to download the zip file containing a sample VS 2005 project.

Feedback is welcome and appreciated.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Manu Agrawal

Web Developer

United States United States

Member

Manu Agrawal is a .NET developer living in the USA.
He has good professional web development experience (mainly in ASP.NET, C#). He enjoys developing high performance and secure websites.
He holds a master's degree in E-Commerce and Management from London, UK.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralProblem with styles Pinmemberbenny6012:36 17 Oct '09  
GeneralRe: Problem with styles PinmemberManu Agrawal13:25 12 Nov '09  
Questionimages and css file path Pinmemberdeching19:45 17 May '09  
AnswerRe: images and css file path PinmemberManu Agrawal13:27 12 Nov '09  
GeneralAnother easy and efficient approach sample code Pinmembersamardeep21:04 6 Apr '09  
GeneralFor Simplest Way of writing URL Rewriting PinmemberDotNetGuts10:31 24 Jul '08  
QuestionWhy Not Use UrlRewriter.Net? Pinmembernickyt6:04 19 Jun '08  
GeneralQuestion PinmemberAshley van Gerven16:36 17 Jun '08  
GeneralDoesn't work! Pinmemberadalbas5:46 12 Jun '08  
GeneralURL Rewriting Advice Pinmemberatwalb6:41 11 Jun '08  
Newsimages and css not load on main page Pinmembershaan21:58 11 May '08  
Generalimages not working PinmemberSteve45616:05 18 Mar '08  
GeneralRe: images not working PinmemberManu Agrawal10:47 15 Apr '08  
Hi,
 
1)
If you start your image path with a forward slash like this
"/images/abc.gif"
it will work from root directory.
 
2)
To use relative path you should also have configured your IIS to serve all requests from ASPNET.dll.
and
 
3)
You must have
 
System.IO.Context.RewritePath(Path.GetFileName(Request.RawUrl));
 
above line in the Page_Load() event of your main page.
 
If above does not help, please post your code here or email me.
 
Thanks for visiting this and leaving a comment.
 
Thanks
 
Manu Agrawal
GeneralExcellent Pinmemberultradream4:20 5 Mar '08  
Questionwhy do i lose all my images and my css ? Pinmembergreekhand10:13 19 Sep '07  
AnswerRe: why do i lose all my images and my css ? PinmemberManu Agrawal10:51 19 Sep '07  
GeneralRe: why do i lose all my images and my css ? Pinmembergreekhand11:42 19 Sep '07  
Generali tried some stuff , got another question ... Pinmembergreekhand1:28 20 Sep '07  
GeneralRe: i tried some stuff , got another question ... PinmemberManu Agrawal2:35 22 Sep '07  
GeneralRe: i tried some stuff , got another question ... Pinmembergreekhand4:17 25 Sep '07  
GeneralDotNetNuke friendly urls PinmemberTommi G15:03 16 May '07  
GeneralPOST back problems PinmemberAndrei Rinea10:55 8 May '07  
NewsValidators and WebResource.axd in general PinmemberAndrei Rinea5:12 3 May '07  
GeneralRe: Validators and WebResource.axd in general PinmemberManu Agrawal5:57 3 May '07  
AnswerRe: Validators and WebResource.axd in general PinmemberAndrei Rinea6:09 21 May '07  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120529.1 | Last Updated 21 Apr 2007
Article Copyright 2007 by Manu Agrawal
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid