利用 ASP.NET3.5(ASP.NET4.0) 的路由功能建立搜尋引擎友好的 URL

來源:互聯網
上載者:User

注意:本文所講述的並非MVC架構。

ASP.NET 3.5 SP1中提供了一種路由技術。ASP.NET 路由是一種能夠使我們在ASP.NET應用程式中利用一種可描述的、對搜尋引擎和使用者很友好的URL訪問資源的技術。這種URL不必物理地映射到真正的資源。比如:

http://dotnet.aspx.cc/Article.aspx?articleId=8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8

這個 URL 實際上是映射到網站根目錄下的一個Article.aspx檔案。使用ASP.NET路由技術,可以使用類似下面的URL進行訪問:

http://dotnet.aspx.cc/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/read.aspx

實現這種URL,有兩種技術可以做到:URL重寫和 URL路由:

1,URL 重寫通過在將請求發送到網頁之前實際更改 URL 來處理傳入請求。例如,一個使用 URL 重寫的應用程式可能會將 URL 從
/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/read.aspx 更改為
/Article.aspx?articleId=8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8。此外,URL
重寫通常沒有相應的 API 來建立基於模式的 URL。在 URL 重寫中,如果更改了 URL 模式,則必須手動更新包含原始 URL
的所有超連結。

2,由於 ASP.NET 路由可以從 URL 提取值,所以處理傳入請求時不更改 URL。如果必須建立一個 URL,則將參數值傳遞到為您產生
URL 的方法中。若要更改 URL 模式,請在某位置更改該模式,您在應用程式中建立的基於該模式的所有連結將自動使用新模式。

若要啟用路由,必須更改應用程式的設定檔來註冊路由程式集,並添加 UrlRoutingModule
類作為模組。還必須為路由建立一個自訂路由處理常式。該處理常式實現IRouteHandler 介面並建立 Web Form(.aspx
檔案)的一個執行個體,該執行個體將為請求的實際終結點。

下面我們就以完整的例子來簡單說明如何在網站發布系統中使用這項技術。

1,首先建立表 Article 用來儲存文章資料內容,從 SQL Server 2000 建立指令碼功能建立出SQL語句:

REATE TABLE [Article] (<br /> [ArticleId] [int] IDENTITY (1, 1) NOT NULL ,<br /> [Title] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,<br /> [CreateDate] [datetime] NOT NULL CONSTRAINT [DF_Article_CreateDate] DEFAULT (getdate()),<br /> [Content] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,<br /> CONSTRAINT [PK_Article] PRIMARY KEY CLUSTERED<br /> (<br /> [ArticleId]<br /> ) ON [PRIMARY]<br />) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]<br />GO<br />

 


2,在VS2008SP1或者VS2010中,建立一個ASP.NET網站,添加對System.Web.Routing的引用;

 

3,建立自訂路由處理常式,在網站工程中添加新項“類”,命名為ArticleRouteHandler.cs,類的網站內容如下:

using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Web;<br />using System.Web.UI;<br />using System.Web.Routing;<br />using System.Web.Compilation;<br />/// <summary><br />///ArticleRouteHandler 的摘要說明<br />/// </summary><br />public class ArticleRouteHandler : IRouteHandler<br />{<br /> public ArticleRouteHandler()<br /> {<br /> //<br /> //TODO: 在此處添加建構函式邏輯<br /> //<br /> }<br /> public IHttpHandler GetHttpHandler(RequestContext requestContext)<br /> {<br /> string ArticleGuid = requestContext.RouteData.Values["ArticleGuid"] as string;<br /> HttpContext context = HttpContext.Current;<br /> context.Items.Add("ArticleGuid", ArticleGuid);<br /> string action = (requestContext.RouteData.Values["Action"] as string).ToLower();<br /> if (action.Equals("read"))<br /> return BuildManager.CreateInstanceFromVirtualPath("~/ArticleShow.aspx", typeof(Page)) as Page;<br /> else if (action.Equals("new"))<br /> return BuildManager.CreateInstanceFromVirtualPath("~/ArticleAdd.aspx", typeof(Page)) as Page;<br /> else if (action.Equals("edit"))<br /> return BuildManager.CreateInstanceFromVirtualPath("~/ArticleEdit.aspx", typeof(Page)) as Page;<br /> else if (action.Equals("comment"))<br /> return BuildManager.CreateInstanceFromVirtualPath("~/ArticleComment.aspx", typeof(Page)) as Page;<br /> else if (action.Equals("print"))<br /> return BuildManager.CreateInstanceFromVirtualPath("~/ArticlePrint.aspx", typeof(Page)) as Page;<br /> else<br /> return BuildManager.CreateInstanceFromVirtualPath("~/ArticleList.aspx", typeof(Page)) as Page;<br /> }<br />}

注意:

using System.Web.UI;

using System.Web.Routing;

using System.Web.Compilation;

這3行代碼是新加的。 

在這裡,我們將URL地址中的預留位置參數放到 HttpContext.Current 對象中,以便在真正的處理頁面中進行擷取,然後執行相應的操作。關鍵的代碼是這幾句:

string ArticleGuid = requestContext.RouteData.Values["ArticleGuid"] as string;

HttpContext context = HttpContext.Current;

context.Items.Add("ArticleGuid", ArticleGuid);

4,在Global裡註冊路由,其代碼為:

<%@ Application Language="C#" %><br /><%@ Import Namespace="System.Web.Routing" %><br /><mce:script RunAt="server"><!--<br /> void Application_Start(object sender, EventArgs e)<br /> {<br /> RegisterRoutes(RouteTable.Routes);<br /> }<br /> public static void RegisterRoutes(RouteCollection routes)<br /> {<br /> routes.Add("ArticleRoute", new Route<br /> (<br /> "Article/{ArticleGuid}/{Action}.aspx",<br /> new ArticleRouteHandler()<br /> )<br /> );<br /> }</p><p>// --></mce:script>

這裡,作為例子,只定義了一條URL規則,Article/{ArticleGuid}/{Action}.aspx。 

5,按照自訂路由處理常式中定義的實際處理常式,分別添加ArticleShow.aspx、ArticleAdd.aspx、
ArticleEdit.aspx、ArticleComment.aspx、ArticlePrint.aspx和ArticleList.aspx等
真正的處理常式。

作為例子,這裡列出ArticleShow.aspx、ArticleAdd.aspx和ArticleList.aspx的原始碼分別如下:

ArticleAdd.aspx

<%@ Page Language="C#" ValidateRequest="false" %><br /><%@ Import Namespace="System.Data" %><br /><%@ Import Namespace="System.Data.SqlClient" %><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><mce:script runat="server"><!--<br /> protected void Button1_Click(object sender, EventArgs e)<br /> {<br /> String ConnectionString = "Data Source=(local);Initial Catalog=ArticleDev;User ID=sa;Password=sa";<br /> SqlConnection cn = new SqlConnection(ConnectionString);<br /> cn.Open();<br /> String sql = "Insert Into Article(Title,Content) Values(@Title,@Content)";<br /> SqlCommand cmd = new SqlCommand(sql, cn);<br /> cmd.Parameters.AddWithValue("@Title", TextBox1.Text);<br /> cmd.Parameters.AddWithValue("@Content", TextBox2.Text);<br /> int ret = cmd.ExecuteNonQuery();<br /> if (ret == 1)<br /> {<br /> Label1.Text = "添加成功。";<br /> }<br /> else<br /> {<br /> Label1.Text = "添加失敗。";<br /> }<br /> cn.Dispose();<br /> }<br />// --></mce:script><br /><html xmlns="http://www.w3.org/1999/xhtml"><br /><head runat="server"><br /> <title></title><br /></head><br /><body><br /> <form id="form1" runat="server"><br /> <div>文章標題:<asp:TextBox ID="TextBox1" runat="server" Width="767px"></asp:TextBox></div><br /> <div>文章內容:<br /><br /> <asp:TextBox ID="TextBox2" runat="server" Width="845px" Height="319px" TextMode="MultiLine"><br /> </asp:TextBox></div><br /> <asp:Button ID="Button1" runat="server" Text="添加文章" OnClick="Button1_Click" /><br /> <asp:Label ID="Label1" runat="server" Text=""></asp:Label><br /> </form><br /></body><br /></html>

ArticleShow.aspx

<%@ Page Language="C#" %><br /><%@ Import Namespace="System.Data" %><br /><%@ Import Namespace="System.Data.SqlClient" %><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><mce:script runat="server"><!--<br /> protected void Page_Load(object sender, EventArgs e)<br /> {<br /> int ArticleGuid = 0;<br /> HttpContext context = HttpContext.Current;<br /> if (context.Items["ArticleGuid"] != null)<br /> {<br /> Int32.TryParse(context.Items["ArticleGuid"].ToString(), out ArticleGuid);<br /> }<br /> if (ArticleGuid < 1)<br /> {<br /> ArticleTitle.InnerHtml = "載入文章錯誤";<br /> ArticleContent.InnerHtml = "指定的 標識 無效!";<br /> ArticleContent.Style["color"] = "#f00";<br /> }<br /> else<br /> {<br /> String ConnectionString = "Data Source=(local);Initial Catalog=ArticleDev;User ID=sa;Password=sa";<br /> SqlConnection cn = new SqlConnection(ConnectionString);<br /> cn.Open();<br /> String sql = "Select * From Article Where ArticleId = @ArticleId";<br /> SqlCommand cmd = new SqlCommand(sql, cn);<br /> cmd.Parameters.AddWithValue("@ArticleId", ArticleGuid);<br /> SqlDataReader dr = cmd.ExecuteReader();<br /> if (dr.Read())<br /> {<br /> ArticleTitle.InnerHtml = dr["Title"].ToString();<br /> ArticleContent.InnerHtml = dr["Content"].ToString();<br /> }<br /> else<br /> {<br /> ArticleTitle.InnerHtml = "載入文章錯誤";<br /> ArticleContent.InnerHtml = "指定的文章不存在!";<br /> ArticleContent.Style["color"] = "#f00";<br /> }<br /> cn.Dispose();<br /> }<br /> }<br />// --></mce:script><br /><html xmlns="http://www.w3.org/1999/xhtml"><br /><head runat="server"><br /> <title></title><br /></head><br /><body><br /> <form id="form1" runat="server"><br /> <h2 id="ArticleTitle" runat="server" style="text-align:center" mce_style="text-align:center"><br /> </h2><br /> <hr /><br /> <div id="ArticleContent" runat="server"><br /> </div><br /> </form><br /></body><br /></html>

這段代碼中,我們從自訂路由處理常式中添加的 HttpContext 對象中取出參數 context.Items["ArticleGuid"],然後進行處理。

ArticleList.aspx

<%@ Page Language="C#" %><br /><%@ Import Namespace="System.Data" %><br /><%@ Import Namespace="System.Data.SqlClient" %><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><br /><mce:script runat="server"><!--<br /> protected void Page_Load(object sender, EventArgs e)<br /> {<br /> String ConnectionString = "Data Source=(local);Initial Catalog=ArticleDev;User ID=sa;Password=sa";<br /> SqlConnection cn = new SqlConnection(ConnectionString);<br /> cn.Open();<br /> String sql = "Select * From Article Order By ArticleId DESC";<br /> SqlCommand cmd = new SqlCommand(sql, cn);<br /> SqlDataReader dr = cmd.ExecuteReader();<br /> GridView1.DataSource = dr;<br /> GridView1.DataBind();<br /> cn.Dispose();<br /> }<br />// --></mce:script><br /><html xmlns="http://www.w3.org/1999/xhtml"><br /><head runat="server"><br /> <title></title><br /></head><br /><body><br /> <form id="form1" runat="server"><br /> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"><br /> <Columns><br /> <asp:HyperLinkField DataNavigateUrlFields="ArticleId" DataTextField="Title"<br /> DataNavigateUrlFormatString="~/Article/{0}/read.aspx" HeaderText="標題" /><br /> <asp:BoundField DataField="CreateDate" HtmlEncode="false" HeaderText="發布日期"<br /> DataFormatString="{0:yyyy-MM-dd HH:mm:ss}" /><br /> </Columns><br /> </asp:GridView><br /> </form><br /></body><br /></html>

6,如果IIS裡設定的ASP.NET版本是 ASP.NET 4.0,無需配置以下的配置,如果是ASP.NET 2.0,則需要在web.config裡配置路由。

在應用程式的 Web.config 檔案中,將 ASP.NET 路由程式集添加到 assemblies 元素

<assemblies><br /> <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/><br /></assemblies>

如果應用程式在 IIS 6.0 或 IIS 7.0 經典模型下運行,則將 UrlRoutingModule 類添加到 httpModules 元素

<httpModules><br /> <add name="UrlRoutingModule"<br /> type="System.Web.Routing.UrlRoutingModule,<br /> System.Web.Routing,<br /> Version=3.5.0.0,<br /> Culture=neutral,<br /> PublicKeyToken=31BF3856AD364E35"/><br /></httpModules>

 

下面就可以使用下面的地址進行訪問了。當然,這裡只是一個例子,更多的功能處理有待於我們在實踐中加以處理。

http://dotnet.aspx.cc/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/comment.aspx

http://dotnet.aspx.cc/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/new.aspx

http://dotnet.aspx.cc/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/edit.aspx

http://dotnet.aspx.cc/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/read.aspx

http://dotnet.aspx.cc/article/8d01fd5e-b2c1-40f5-8cea-bc2197fb9bd8/print.aspx

以上例子只是簡單地進行了說明,實際應用中,還有更多的東西需要考慮,更多的資訊可以參考如下的連結:

ASP.NET 路由(http://msdn.microsoft.com/zh-cn/library/cc668201.aspx)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.