从.NET框架3.5 SP1开始,微软推出了ASP.NET路由支持,从而实现了特定资源的URL与其对应的Web服务器上的物理文件之间的彻底解耦。借助于ASP.NET路由支持,开发人员可以定义一组路由规则,从而实现把路由模式映射到一个生成相应内容的类。例如,你可以把URL"Categories/CategoryName"映射到一个类,该类接收CategoryName而最终生成对应于此种类的产品信息显示于一个网格中的一组HTML标记。有了这样的映射,用户便可以通过访问www.yoursite.com/Categories/Beverages来查看饮料种类对应的所有产品信息。
在.NET 3.5 SP1中,ASP.NET路由主要是为ASP.NET MVC应用而设计的,虽然在非ASP.NET MVC框架支持的Web窗体应用程序中也有可能实现ASP.NET路由支持。然而,在Web窗体应用程序中实现ASP.NET路由会涉及大量额外的工作。
在Web窗体中,通常情况下,我们都要把路由模式映射到一个实际的ASP.NET页面。为此,我们需要创建一个路由处理类以便在请求路由URL时调用之,并且在一定意义上实现了把请求调度到适当的ASP.NET页面。例如,为了把一个路由映射到一个物理文件,比如把Categories/CategoryName映射到ShowProductsByCategory.aspx,我们需要如下三个步骤:
(1)在Global.asax文件中定义映射,用于把路由模式映射到一个路由处理类;
(2)创建路由处理类,它负责解析网址,把所有路由参数存储到一些目标页面可以访问到的位置(如HttpContext.Items),并返回一个目标页面或处理请求路由的HTTP处理器的实例;
(3)在目标页面中编写代码来获取路由参数,并使用他们生成页面内容。
且不说花费了多大的代价仅仅读取前面的语句(更不用担编写之),你完全能够想象到-在Web窗体应用程序中执行ASP.NET路由不一定是开发人员最直接的任务。
值得庆幸的是,ASP.NET 4.0通过添加一组类和助理方法极大地简化了ASP.NET路由在Web窗体应用程序中的使用。使用ASP.NET 4.0,你会更容易地定义路由规则,而不再需要创建一个自定义路由处理类。本文将详细探讨这方面的改进支持。
一、ASP.NET路由技术概述
ASP.NET路由能够干净地实现URL与网页文件名之间的解耦,从而可用于创建干净、简洁且搜索引擎友好的网址。有关为什么应该在Web应用程序中使用ASP.NET路由的详细讨论,在此不作详细讨论,请参考其他有关文章。
概括地说,ASP.NET路由允许开发人员定义路由规则,从而实现把一个路由模式(如Categories/CategoryName)映射到一个处理请求的类。这些路由规则在应用程序启动时就已经定义在文件Global.asax中的Application_Start事件处理程序中。
在Web窗体应用程序中,我们可能已经拥有了产生我们感兴趣内容的ASP.NET网页,我们只需要通过路由规则把路由模式映射到这些ASP.NET页面-通过把任何路由参数(例如CategoryName)映射到该ASP.NET页面来实现。当在ASP.NET 3.5 SP1中使用ASP.NET路由时,没有方法直接把路由模式映射到ASP.NET页。相反,我们必须创建一个路由处理类,它负责传递有关传入请求的信息,并且必须返回一个HTTP处理程序来处理此请求。通常,在Web窗体应用程序中一个路由处理类执行以下步骤:
(1)根据需要解析网址,或许研究某些路由参数,并以这些值为基础作出决定。
(2)从需要被传递到ASP.NET页面或HTTP处理程序(它们将处理这一请求)的URL加载任何路由参数。总之,我们要确保ASP.NET页面会生成实际内容,因为此请求知道所有路由参数(如CategoryName)的值。一个传达这样的信息的办法是,把它们放在HttpContext.Items集合中-此集合担当存储特定长度的请求信息的数据存储信息库的作用。
(3)返回执行上述处理的ASP.NET页面或HTTP处理程序的实例。
通常,这些路由处理程序类具有差不多相似的特征。你把路由参数存储到HttpContext.Items集合中,然后创建并返回一个负责生成该网址对应内容的ASP.NET页面的实例。尽管路由处理类具有相似特征,但是编写这些类是一项冗长的任务,因为每个新路由都需要一个新的处理程序类,而此类需要实现几乎与前一个类同样的任务。
在ASP.NET 3.5 SP1中使用ASP.NET路由的另一种挑战主要与负责生成最终内容的ASP.NET页面相关。此页面必须从HttpContext.Items集合((或其它其他存储它们的路由处理程序类)中读出路由参数。此外,为一个超链接或Response.Redirect调用生成路由友好的URL(如Categories/CategoryName)的语法也有点冗长和混乱。
在ASP.NET 4.0中,路由支持得到了增强,包括一些新的路由相关的方法,从而使定义映射到实际ASP.NET页面的路由规则更加简单。在ASP.NET 4.0中,你不再需要创建自定义路由处理程序类作为中介,而只需要从Global.asax文件中的路由规则中直接引用ASP.NET页面即可。当从路由规则中指定一个ASP.NET页面时,路由参数被自动存储在一个新的RouteData集合中,此集合可以从ASP.NET页面中通过Page.RouteData结构进行访问。更重要的是,在.NET框架4.0中包括一个自定义参数控件,这样一来,你可以使用声明的方式从ASP.NET的数据源控件(如SqlDataSource和LinqDataSource等)中使用RouteData中的值,而且也提供了一些方法来生成路由友好的URL,以及重定向到路由友好的网址。
本文将重点讨论ASP.NET在ASP.NET 4.0中的路由系统改进支持。本文提供的演示程序是一个Web窗体应用程序,这是一个罗斯文商贸网站的前端。它使用了ASP.NET路由支持来创造简洁且搜索引擎友好的网址。例如,/Categories/All将显示所有类别,/Categories/Beverages将列出属于饮料类的所有产品,而/Products/Chai将显示有关产品Chai的细节信息。
请注意,为了在ASP.NET 3.5 SP1中使用ASP.NET路由支持,你需要明确地在你的项目中添加对System.Web.Routing程序集的引用,并需要添加一些标记到Web.config配置文件中。这些步骤在使用ASP.NET 4.0时不再需要,而且,在Global.asax文件中用于定义路由规则的语法更为短小、简单和具有可读性。
本文后面的内容将给出在ASP.NET 4.0中使用ASP.NET路由的详细步骤描述。