Click here to Skip to main content
15,885,366 members
Articles / Programming Languages / C# 4.0
Article

An Example of URL Rewriting With ASP.NET

Rate me:
Please Sign up or sign in to vote.
3.19/5 (12 votes)
22 Aug 2013CPOL3 min read 98.6K   4.9K   23   12
This article introduces URL rewriting using a data-driven application. This application creates various blogs and these blogs are accessed by the title of the blog.

Introduction

URL rewriting is the process of intercepting an incoming Web request and redirecting the request to a different resource. When performing URL rewriting, typically the URL being requested is checked and, based on its value, the request is redirected to a different URL. For example, a website restructuring web pages of a specified directory or article and when accessing a web page from an article or directory by URL then the URL is automatically moved on to the Blog directory. That happens by URL rewriting.

This article introduces URL rewriting using a data-driven application. This application creates various blogs and these blogs are accessed by the title of the blog.

Database Design for Application

First of all we create a table Blog that has blog information like title, content and so on. This table has a primary key id and a Visit field for the total number visits for a specific blog.

SQL
CREATE TABLE Blog
(
    Id int Identity(1,1) Primary Key,
    Title nvarchar(100),
    Content nvarchar(max),
    Visit int default 0,
    createDate datetime default getDate()
)

After designing the table we create two Stored Procedures, one for inserting a blog and another for counting the blog visitors. First we create the proc_BlogInsert Stored Procedure to insert a new record or blog entry in the blog table.

SQL
CREATE PROCEDURE proc_BlogInsert
    @title nvarchar(100),
    @content nvarchar(max) 
AS
BEGIN
if not exists(SELECT Id from Blog Where Title = @title)
begin
    INSERT INTO Blog (Title,Content) VALUES (@title,@content)
end
END

Now we create another Stored Procedure, "proc_VisitorIncrement", to increment the visitor counter when a blog is visited.

SQL
CREATE procedure proc_VisitorIncrement
(
    @id int
)   
AS
begin
    update Blog set Visit += 1 where Id = @id
end

Create Business object and Data Access Layer

We create a Blog class that has properties and a constructor for a blog and it will be used to pass blog data on the UI.

C#
namespace URLRewrittingExample.Blogs
{
    public class Blog
    {
        private int mId=0;
        private string mTitle = string.Empty;
        private string mContent = string.Empty;
        private int mVisit = 0;
 
        public Blog(string title, string content)
        {
            mTitle = title;
            mContent = content;
        }
 
        public Blog(int id, string title, int visit)
        {
            mId = id;
            mTitle = title;
            mVisit = visit;
        }
 
        public Blog(int id, string title, int visit, string content)
        {
            mId = id;
            mTitle = title;
            mVisit = visit;
            mContent = content;
        }
        public int Id
        {
            get { return mId; }
            set { mId = value; }
        }
       
        public string Title
        {
            get { return mTitle; }
        }
 
        public string Content
        {
            get { return mContent; }
        }
 
        public int Visit
        {
            get { return mVisit; }
            set { mVisit = value; }
        }
    }
}

We need a connection with the database to perform create, insert, update and delete operations on the blog table so we define a connection string in the web.config file.

XML
<connectionStrings>
    <add name="DbConnectionString" 
      connectionString="Data Source=sandeepss-PC;Initial Catalog=CodeFirst;User ID=sa; Password=123456" 
      providerName="System.Data.SqlClient" />
</connectionStrings>

After that we create a data access layer. In this layer we have a class BlogDAL (BlogDAL.cs) that has all database related operations for a blog in the application.

C#
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
 
namespace URLRewrittingExample.Blogs
{
    public class BlogDAL
    {
        public static SqlConnection DatabaseConnection()
        {         
            string connectionString = 
              ConfigurationManager.ConnectionStrings["DbConnectionString"].ConnectionString;
            SqlConnection con = new SqlConnection(connectionString);          
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                return con;           
        }
 
        public int BlogInsert(Blog objBlog)
        {
            using (SqlCommand cmd = new SqlCommand("proc_BlogInsert", DatabaseConnection()))
            {
                using (SqlDataAdapter dap = new SqlDataAdapter(cmd))
                {
                    dap.InsertCommand = cmd;
                    dap.InsertCommand.CommandType = CommandType.StoredProcedure;
                    dap.InsertCommand.Parameters.AddWithValue("@title", objBlog.Title);
                    dap.InsertCommand.Parameters.AddWithValue("@content", objBlog.Content);
                    return dap.InsertCommand.ExecuteNonQuery();
                }
            }
           
        }
 
        public List<Blog> GetAllBlogs()
        {
            List<Blog> blogsList = new List<Blog>();           
            SqlCommand cmd = new SqlCommand("Select Id,Title,Visit from Blog", DatabaseConnection());
            IDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                blogsList.Add(new Blog(Convert.ToInt32(dr["Id"].ToString()),dr["Title"].ToString(),
                                            Convert.ToInt32(dr["Visit"].ToString())));
            }
            dr.Close();
            return blogsList;
        }
 
        public Blog GetBlogById(int id)
        {
            Blog objBlog = null;
            SqlCommand cmd = new SqlCommand("Select Title,Visit,Content from Blog where Id="+id, DatabaseConnection());
            IDataReader dr = cmd.ExecuteReader();
            while(dr.Read())
            {              
             objBlog = new Blog(id,
                                dr["Title"].ToString(),
                                Convert.ToInt32(dr["Visit"].ToString()),
                                dr["Content"].ToString());
            }
            dr.Close();
            return objBlog;
        }
 
        public int BlogVisitorIncrement(int id)
        {
            using (SqlCommand cmd = new SqlCommand("proc_VisitorIncrement", DatabaseConnection()))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
                {
                    adapter.UpdateCommand = cmd;                   
                    SqlParameter param = new SqlParameter("@id",id);
                    adapter.UpdateCommand.Parameters.Add(param);                                    
                    return adapter.UpdateCommand.ExecuteNonQuery();
                }
            }
        }
    }
}

Our business object and data access layer is ready.

Application UI Design

We create a UI design for the application. This application has a three-part UI.

  • Insert a Blog
  • Show All Blog List
  • Show individual Blog with Content

Let's see each one by one.

Insert a Blog

To insert a blog we design a UI page that can take two inputs, one is the blog title and the other is blog content. For the blog title we use a TextBox and for the blog content we use an Editor of AjaxControlToolkit. We also use a submit button on the page that inserts a blog record.

ASP.NET
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="AnExampleOfURLRewriting.Index" %>
 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit.HTMLEditor" TagPrefix="cc1" %>
 
<!DOCTYPE html>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="Style/BaseStyleSheet.css" rel="stylesheet" />
</head>
<body>
    <form id="form1" runat="server">
      <asp:ScriptManager ID="ScriptManager1" runat="server">               
        </asp:ScriptManager>
       
    <div class="formRowContainer">
        <div class="labelContainer">Title</div>
        <div class="valueContainer">
            <asp:TextBox ID="txtTitle" runat="server"></asp:TextBox>
        </div>
    </div>
    <div class="clearStyle"></div>
    <div class="formRowContainer">
        <div class="labelContainer">Content</div>
        <div class="valueContainer">
            <cc1:Editor id="blogEditor" runat="server"></cc1:Editor>           
        </div>       
    </div>
    <div class="clearStyle"></div>
        <div class="buttonContainer">
            <asp:Button ID="btnSubmit" runat="server" Text="Create" OnClick="btnSubmit_Click" />
        </div>
    </form>
</body>
</html>

After designing the UI, we write the logic on its code behind file for inserting a blog. There is a submit button click event that insert a record in the database.

C#
using System;
using URLRewrittingExample.Blogs;

namespace AnExampleOfURLRewriting
{
    public partial class Index : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            Blog objBlog = new Blog(txtTitle.Text.Trim(), blogEditor.Content);
            BlogDAL objBlogDAL = new BlogDAL();
            int effectedRows = objBlogDAL.BlogInsert(objBlog);
        }
    }
}

 UI screen for new blog insert

Figure 1.1 : UI screen for new blog insert

Show All Blog List

We create a UI screen that shows all blog titles along with total visitor counter. To create a blog list we use a repeater control of ASP.Net. In a repeater we use a link button for the title so we can click on the title and get blog data on the new page.

ASP.NET
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="BlogList.aspx.cs" 
          Inherits="URLRewrittingExample.Blogs.BlogList" %>

<!DOCTYPE html>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <link href="../Style/BaseStyleSheet.css" rel="stylesheet" />
</head>
<body>
    <form id="form2" runat="server">
    <div>
        <asp:Repeater ID="rptBlog" runat="server" OnItemDataBound="rptBlog_ItemDataBound">
            <HeaderTemplate>
                <table class="gridtable">
                <tr>
                    <th>Title</th>
                    <th>Visit</th>
                </tr>
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td><asp:LinkButton id="lnkTitle" runat="server" 
                             Text='<%#Eval("Title") %>'></asp:LinkButton></td>
                    <td><%#Eval("Visit") %></td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>
    </div>
    </form>
</body>
</html>

Now create a method in the code behind file for a repeater bind and create a custom URL according to the title of the blog.

C#
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace URLRewrittingExample.Blogs
{
    public partial class BlogList : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                ShowBlogList();
            }
        }
        private void ShowBlogList()
        {
            BlogDAL objBlogDAL = new BlogDAL();
            rptBlog.DataSource = objBlogDAL.GetAllBlogs();
            rptBlog.DataBind();
        }

        protected void rptBlog_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || 
                     e.Item.ItemType == ListItemType.AlternatingItem)
            {
                LinkButton lnkTitle = (LinkButton) e.Item.FindControl("lnkTitle");
                lnkTitle.Style.Add("text-decoration", "none");
                Blog Item =(Blog) e.Item.DataItem;
                lnkTitle.PostBackUrl = GenerateURL(Item.Title, Item.Id);
            }
        }

        public static string GenerateURL(string title, int Id)
        {
            string strTitle = title.Trim();
            strTitle = strTitle.ToLower();        
            strTitle = strTitle.Replace("c#", "C-Sharp");
            strTitle = strTitle.Replace(" ", "-");
            strTitle = strTitle.Trim();        
            strTitle = strTitle.Trim('-');
            strTitle = "~/Blogs/"+strTitle+"-"+Id.ToString() + ".aspx";

            return strTitle;
        }
    }
}

List of All blogs

Figure 1.2 : Show all blog list

Show individual Blog with Content

Now create a simple page with a div to show blog content along with blog title and visitor number.

ASP.NET
<%@ Page Language="C#" AutoEventWireup="true" 
      CodeBehind="BlogShow.aspx.cs" Inherits="URLRewrittingExample.Blogs.BlogShow" %>

<!DOCTYPE html>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form3" runat="server">
    <div>
    <div id="divTitle" runat="server"></div>
        <span id="spVisitor" runat="server"></span>
    <div id="divContent" runat="server"></div>
    </div>
    </form>
</body>
</html>

After that we write logic for the code behind page for two operations, one is the show content page and the other is for the visitor counter. The visitor counter increments when the page is initialized.

C#
using System;

namespace URLRewrittingExample.Blogs
{
    public partial class BlogShow : System.Web.UI.Page
    {
        protected void Page_Init(object sender, EventArgs e)
        {
            if (Request.QueryString.Get("id") != null)
            {
                int id= Convert.ToInt32(Request.QueryString.Get("id"));
                BlogDAL objBlogDAL = new BlogDAL();
                objBlogDAL.BlogVisitorIncrement(id);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString.Get("id") != null)
            {
                int id = Convert.ToInt32(Request.QueryString.Get("id"));
                DisplayBlog(id);
            }
        }
        private void DisplayBlog(int id)
        {
            BlogDAL objBlogDAL = new BlogDAL();
            Blog objBlog = objBlogDAL.GetBlogById(id);
            divTitle.InnerHtml = objBlog.Title;
            spVisitor.InnerHtml ="Total Visits "+ objBlog.Visit;
            divContent.InnerHtml = objBlog.Content;
        }
    }
}

show blog content

Figure 1.3 Blog content with different URL

In Figure 1.3 you have noticed a different SEO friendly URL for a .aspx page. That page doesn't exist in our blog application but it is created by URL rewriting. URL rewriting implements the global.asax file's Application_BeginRequest event. This event calls every request and maps the URL on based on the requested URL.

C#
protected void Application_BeginRequest(object sender, EventArgs e)
{
    string origionalpath = Request.Url.ToString();
    string subPath = string.Empty;
    string blogId = string.Empty;
    int id = 0;
    if (origionalpath.Contains("Blogs"))
    {
        if (origionalpath.Length >= 22)
        {
            subPath = origionalpath.Substring(22);
            if (subPath.Length >= 1)
            {
                blogId = Regex.Match(subPath, @"\d+").Value;
                bool isValid = Int32.TryParse(blogId, out id);
                if (isValid)
                {
                    Context.RewritePath("BlogShow.aspx?id=" + id);
                }
            }
        }
    }
}

Note: Download the zip folder that has all files for this application and learn URL rewriting with ASP.NET using 3-tier architecture.

License

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


Written By
Software Developer
India India
He is awarded for Microsoft TechNet Guru, CodeProject MVP and C# Corner MVP. http://l-knowtech.com/

Comments and Discussions

 
Questionhow to pass a string value using rewrite module for ASP.net Pin
User 941635423-Mar-17 8:43
professionalUser 941635423-Mar-17 8:43 
QuestionIf used an another repeater blog 's post page then its not working. on click of this repeater it redirect to physical page . Pin
Member 109166967-Oct-14 5:11
Member 109166967-Oct-14 5:11 
QuestionPaging not works when we are using the same and to the post back Pin
NikhilRohitsir27-Sep-14 21:33
NikhilRohitsir27-Sep-14 21:33 
Questionworking partially not complete . need help Pin
Member 109166961-Jul-14 3:06
Member 109166961-Jul-14 3:06 
AnswerRe: working partially not complete . need help Pin
Sandeep Singh Shekhawat30-Aug-14 16:37
professionalSandeep Singh Shekhawat30-Aug-14 16:37 
QuestionDatabase Back Up is missing in sample application Pin
meeran11122224-Nov-13 20:54
meeran11122224-Nov-13 20:54 
AnswerRe: Database Back Up is missing in sample application Pin
Sandeep Singh Shekhawat13-Jan-14 2:02
professionalSandeep Singh Shekhawat13-Jan-14 2:02 
QuestionAjax is not working Pin
AnkushSharma1001-Nov-13 2:55
AnkushSharma1001-Nov-13 2:55 
AnswerRe: Ajax is not working Pin
Sandeep Singh Shekhawat1-Nov-13 17:57
professionalSandeep Singh Shekhawat1-Nov-13 17:57 
GeneralRe: Ajax is not working Pin
AnkushSharma1001-Nov-13 21:54
AnkushSharma1001-Nov-13 21:54 
GeneralMy vote of 1 Pin
Biswakalyan Mahanta19-Sep-13 3:07
Biswakalyan Mahanta19-Sep-13 3:07 
GeneralRe: My vote of 1 Pin
Sandeep Singh Shekhawat30-Aug-14 16:38
professionalSandeep Singh Shekhawat30-Aug-14 16:38 

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

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