快捷搜索:

利用 ASP.NET3.5(ASP.NET4.0) 的路由功能创建搜索引擎

留意:本文所讲述的并非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 窗体(.aspx 文件)的一个实例,该实例将为哀求的实际遣散点。

下面我们就以完备的例子来简单阐明若何在网站宣布系统中应用这项技巧。

1,起开创建表 Article 用来存储文章数据内容,从 SQL Server 2000 创建脚本功能创建出SQL语句:

REATE TABLE [Article] (

[ArticleId] [int] IDENTITY (1, 1) NOT NULL ,

[Title] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NOT NULL ,

[CreateDate] [datetime] NOT NULL CONSTRAINT [DF_Article_CreateDate] DEFAULT (getdate()),

[Content] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,

CONSTRAINT [PK_Article] PRIMARY KEYCLUSTERED

(

[ArticleId]

)ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

2,在VS2008SP1或者VS2010中,新建一个ASP.NET网站,添加对System.Web.Routing的引用;

3,创建自定义路由处置惩罚法度榜样,在网站工程中添加新项“类”,命名为ArticleRouteHandler.cs,类的网站内容如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.Routing;

using System.Web.Compilation;

///

///ArticleRouteHandler 的择要阐明

///

public class ArticleRouteHandler : IRouteHandler

{

public ArticleRouteHandler()

{

//

//TODO: 在此处添加构造函数逻辑

//

}

public IHttpHandler GetHttpHandler(RequestContext requestContext)

{

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

HttpContext context = HttpContext.Current;

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

string action = (requestContext.RouteData.Values["Action"] as string).ToLower();

if (action.Equals("read"))

return BuildManager.CreateInstanceFromVirtualPath("~/ArticleShow.aspx", typeof(Page)) as Page;

else if (action.Equals("new"))

return BuildManager.CreateInstanceFromVirtualPath("~/ArticleAdd.aspx", typeof(Page)) as Page;

else if (action.Equals("edit"))

return BuildManager.CreateInstanceFromVirtualPath("~/ArticleEdit.aspx", typeof(Page)) as Page;

else if (action.Equals("comment"))

return BuildManager.CreateInstanceFromVirtualPath("~/ArticleComment.aspx", typeof(Page)) as Page;

else if (action.Equals("print"))

return BuildManager.CreateInstanceFromVirtualPath("~/ArticlePrint.aspx", typeof(Page)) as Page;

else

return BuildManager.CreateInstanceFromVirtualPath("~/ArticleList.aspx", typeof(Page)) as Page;

}

}

留意:

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里注册路由,其代码为:

这里,作为例子,只定义了一条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

文章标题:

文章内容:

ArticleShow.aspx

这段代码中,我们从自定义路由处置惩罚法度榜样中添加的 HttpContext 工具中掏出参数 context.Items["ArticleGuid"],然落后行处置惩罚。

ArticleList.aspx

6,假如IIS里设置的ASP.NET版本是 ASP.NET 4.0,无需设置设置设备摆设摆设以下的设置设置设备摆设摆设,假如是ASP.NET 2.0,则必要在web.config里设置设置设备摆设摆设路由。 在利用法度榜样的 Web.config 文件中,将 ASP.NET 路由法度榜样集添加到 assemblies 元素

假如利用法度榜样在 IIS 6.0 或 IIS 7.0 经典模型下运行,则将 UrlRoutingModule 类添加到 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)

您可能还会对下面的文章感兴趣: