The Concept of URL Routing in ASP.Net 3.5
What Is Routing?
The Service Pack 1 for the Microsoft .NET Framework 3.5 introduced a routing engine to the ASP.NET runtime. A routing engine can decouple the URL in an incoming HTTP request from the physical Web Form that responds to the request, allowing you to build friendly URLs for your Web applications.
Suppose you have an ASP.NET Web Form named CSharp.aspx, and this form is inside a folder named ‘Tutorial’. Into the classic approach to viewing a tutorial with this Web Form is to build a URL pointing to the physical location of the form and encode some data into the query string to tell the Web Form which the author wants to display. And here, the end of such a URL might look like the following: /Tutorial/CSharp.aspx?AuthorID=7, And after analyze where the number 5 represents a primary key value in a database table full of authors.
Configuring ASP.NET for Routing
To configure an ASP.NET Web site or Web application for routing, you first need to add a reference to the System.Web.Routing assembly. The SP1 installation for the .NET Framework 3.5 will install this assembly into the global assembly cache, and you can find the assembly inside the standard "Add Reference" dialog box.
To run a Web site with routing in IIS 7.0, you need two entries in web.config. The first entry is the URL routing module configuration, which is found in the <modules> section of <system.webServer>. You also need an entry to handle requests for UrlRouting.axd in the <handlers> section of <system.webServer>.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<!-- . . . -->
</modules>
<handlers>
<add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<!-- . . . -->
</handlers>
</system.webServer>
Once you've configured the URL routing module into the pipeline, it will wire itself to the PostResolveRequestCache and the PostMapRequestHandler events.
Configuring Routes
Now to configure route, the first thing is to register the route at application startup. To register the routes at application startup write the following code in your Global.asax file.
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes();
}
private void RegisterRoutes()
{
RouteTable.Routes.Add("Tutorial",new("Tutorial/{subject}/{AuthorID}", new RouteHandler(string.Format("~/CSharp.aspx"))));
}
Here {subject}, {AuthorID} is name of Query Srting, through which we will get access to the value passed through query string.
Now, we need a RouteHandler .
public class RouteHandler : IRouteHandler
{
string _virtualPath;
public RouteHandler(string virtualPath)
{
_virtualPath = virtualPath;
}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
foreach (var value in requestContext.RouteData.Values)
{
requestContext.HttpContext.Items[value.Key] = value.Value;
}
return (Page)BuildManager.CreateInstanceFromVirtualPath(_virtualPath, typeof(Page));
}
}
Now, Routing is configured but what about the query string. How we can get access to values passed through query string. To get the data passed through query string we use context.Items[“ID”] instead of Request.QueryString[“ID”].
HttpContext context = HttpContext.Current;
String id = context.Items["AuthorID"].ToString();
Ashish srivastava
16-Sep-2015abed akhi
11-Sep-2012String id = context.Items["AuthorID"].ToString();
to the load_page method I got problems where should I add this my code is:
<code>
Global.asax:
void Application_Start(object sender, EventArgs e) {
RegisterRoutes(); }
private void RegisterRoutes()
{
System.Web.Routing.RouteTable.Routes.Add("Tutorial", new System.Web.Routing.Route(Server.MapPath("~/")+"webpages/Default5.aspx/{category}", new RouteHandler(string.Format("~/webpages/Default5.aspx"))));
}
Default5.aspx:
public String cat="fenous";
protected void Page_Load(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
cat = context.Items["category"].ToString();
Load_ListView();
}
void Load_ListView() {
try
{
OleDbConnection MyCon; // create connection
OleDbDataAdapter com; // create command
// OleDbDataReader dr; //Dataread for read data from database
string datapath = "websitedatabase.mdb";
string path = Server.MapPath("~/") + datapath;
MyCon = new OleDbConnection("Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + path + "; Jet OLEDB:Database Password=pass");
com = new OleDbDataAdapter("Select * from images where Category='"+cat+"'", MyCon);
MyCon.Open(); // open the connection
DataSet ds = new DataSet();
com.Fill(ds);
ListView1.DataSource = ds;
ListView1.DataBind();
MyCon.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
and I've added the needed code in web.config and I've added the RouteHandler class so what's the problem what I need is that I have a webpage with the name : Default5.aspx I need to display different categories in this page depending on the category added in the url ...
anil babu
16-Aug-2012anil babu
02-Aug-2012anil babu
30-Jul-2012Anonymous User
30-Mar-2012Could you post code for all added routes.
Boopathiraja K
29-Mar-2012Hi Haider,
I am using the URL Routing concept to design my URL.
It is working fine but for the following scenario:-
1. I am in the dashboard screen which has no query string parameters (http://localhost:4499/TestApp/Dashboard)
2. I navigate to settings page which has the query string parameters (http://localhost:4499/TestApp/Settings/100)
3. If I tried to navigate again to dashboard screen, the page is not routing properly (http://localhost:4499/TestApp/Settings/100/Dashboard)
I am using the folowing in my codes:-
routes.Add("Dashboard", new CustomRoute("TestApp/Dashboard", new URLRouteHandler("~/TestApp/Home.aspx")));
routes.Add("Settings", new CustomRoute("TestApp/Settings/{Id}", new URLRouteHandler("~/TestApp/Home.aspx")));
Can you help me to solve this issue?.
Also guide me how to use the below method:-
public CustomRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(url, defaults, routeHandler)
{
}
Anonymous User
29-Dec-2011Hi Dinesh Singh,
Sorry for replying late.
As you can see in the Route, it is "Tutorial/{subject}/{AuthorID}", for "~/CSharp.aspx"
RouteTable.Routes.Add("Tutorial",new("Tutorial/{subject}/{AuthorID}", new RouteHandler(string.Format("~/CSharp.aspx"))));
The about Route means that if there is any URL like “~/Tutorial/Subject/AuthorID” then it will point to “~/CSharp.aspx”.
Suppose, you want to pass “Routing” as subject and “24” as AuthorID, then you can pass it like
Response.Redirect(“~/Tutorial/Routing/24”);
No, if you want to access AuthorID use the cose below.
HttpContext context = HttpContext.Current;
String id = context.Items["AuthorID"].ToString();
Hope this will help you.
Anonymous User
26-Dec-2011James Smith
26-Dec-2011Keep sharing such a useful article.
Anonymous User
26-Dec-2011Thanks Haider.
dinesh singh
20-Dec-2011John Smith
14-Sep-2011Anonymous User
14-Sep-2011Nice article, Great concept given . Its really helpful for beginners.
Thanks.