ASP.NET 4.0 URL路由改进支持 |
从.NET框架3.5 SP1开始,微软推出了ASP.NET路由 支撑,从而实现了特定资源的URL与其对应的Web服务器上的物理文件中间的彻底解耦 。借助于ASP.NET路由 支撑,开发人员 可以定义一组路由 规定,从而实现把路由模式映射到一个生成相应内容的类 。例如,你 可以把URL"Categories/CategoryName"映射到一个类,该类 接纳CategoryName而最平生成对应于此 品种的产品信息显示于一个网格中的一组HTML标记 。 在.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路由的 详尽步骤 形容 。 二、 使用ASP.NET 4.0路由 下面给出在ASP.NET 4.0中 使用ASP.NET路由的 详尽 形容 。 0. 前提 本文提供的演示程序 使用了新增加到ASP.NET 4.0中的ASP.NET路由 性能 。假如你 使用Visual Studio 2010或Visual Web Developer 2010(或更高版本),那么你正好具备了这一前提 。 1.在文件Global.asax中定义路由 规定 要 使用ASP.NET路由系统,你需求在 利用程序启动时定义一个或多个路由 。 步骤是,在你的 名目中增加一个全局 利用程序类文件(Global.asax) 。在这个文件中,我们将在Application_Start事件中注册这些路由 。 定义于Global.asax文件中的路由 批示什么样的路由 解决程序负责 解决什么样的URL模式 。在MVC 利用程序中,一种 风行的模式是Controller/Action/ID;这 象征着针对/Products/View/Aniseed Syrup或Categories/Edit/Beverages的 申请将由配置的路由 解决程序来 解决 。在 利用程序中定义什么样的路由方面,你 可以 占有足够的灵便性 。例如,你 可以定义模式的多个 部分,定义 缺乏 部分的默许值,甚至还要定义针对某些输入类型的 制约 部分 。 本文演示程序是一个 方便的数据驱动 利用程序,它 使用了Northwind数据库,并 承受下列模式的URL: /Categories/All-列出数据库中全部产品类型; /Categories/CategoryName-列出相应于特定类型的产品信息; /Products/ProductName-显示特定产品的信息 。 因此,我在Global.asax文件的Application_Start事件 解决程序中定义了三个路由,如以下代码所示 。(注:RouteTable对象和RouteCollection类位于System.Web.Routing命名空间 。) 在Application_Start 步骤中,我们调用了RegisterRoutes,并传递进RouteCollection类型的参数RouteTable.Routes.接下来,在RegisterRoutes 步骤中,调用RouteCollection类的MapPageRoute 步骤,它定义了一个路由模式到ASP.NET页面的路由映射 。例如,在第一次调用MapPageRoute 步骤时,我们 缔造了一个命名为"All Categories"的路由模式-它负责把路由模式Categories/All映射到ASP.NET页面'/ AllCategories.aspx. 接下来的两个MapPageRoute 步骤调用 使用参数 缔造路由模式 。其中,"View Product"路由把模式Products/{ProductName}映射到ASP.NET页面'/ ViewProduct.aspx.这里,{ProductName}是一个参数, 象征着任何Products/ProductName 模式的 申请都将被路由到'/ViewProduct.aspx页面 。不久你就会看到,{ProductName}参数的值 可以从页面'/ViewProduct.aspx中通过Page.RouteData参数加以 拜访 。 2. 缔造 解决 申请的ASP.NET页面 使用ASP.NET 4.0,你不再需求 缔造一个自定义的路由 解决程序类 。当你 使用MapPageRoute 步骤时,这 所有都会由底层库为你自动 实现 。剩下的仅仅是, 构建 解决 申请的ASP.NET页面(AllCategories.aspx,CategoryProducts.aspx和ViewProduct.aspx) 。固然,本文示例中的这三个网页相当 方便-它们都 使用数据源控件,并以编程 模式绑定到通过路由参数猎取的Categories或者Products表格的数据库 后果 。 void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } void RegisterRoutes(RouteCollection routes) { // Register a route for Categories/All routes.MapPageRoute( "All Categories", //路由名 "Categories/All", //路由URL "'/AllCategories.aspx" // 解决路由的网页 ); // 解决Categories/{CategoryName}的路由 routes.MapPageRoute( "View Category", //路由名 "Categories/{*CategoryName}", //路由URL "'/CategoryProducts.aspx" // 解决路由的网页 ); // Register a route for Products/{ProductName} routes.MapPageRoute( "View Product", //路由名 "Products/{ProductName}", //路由URL "'/ViewProduct.aspx" // 解决路由的网页 ); } 本文演示程序 使用LINQ-to-SQL工具实现数据 拜访 。你会在App_Code文件夹下发现一个Northwind.dbml文件,它 缔造了一个NorthwindDataContext类 。ViewProduct.aspx页面中包括一个DetailsView控件,其中的字段用于显示产品的名称,供给商,单位数量,价格以及 其余 有关信息 。页面的代码 潜藏类 存在以下(省略了 部分)代码: protected void Page_Load(object sender, EventArgs e) { dvProductInfo.DataSource = new Product[] { Product }; dvProductInfo.DataBind(); } private Product _Product = null; protected Product Product { get { if (_Product == null) { string productName = Page.RouteData.Values["ProductName"] as string; NorthwindDataContext DataContext = new NorthwindDataContext(); _Product = DataContext.Products.Where(p => p.ProductName == productName) 。SingleOrDefault(); } return _Product; } } 在上面的Page_Load事件 解决程序中,DetailsView控件被绑定到Product属性返回的Product对象上 。在此,Product属性读取Page.RouteData 集中中的URL中的ProductName参数值, 使用的语法是:Page.RouteData.Values["ProductName"]. 而后,在LINQ 查问中 使用ProductName参数值来取回有关具体产品的信息 。 下面的屏幕截图显示了运行中的ViewProduct.aspx页面 。该网页对应的网址是/Products/Chai,有关该Chai的 详尽信息显示于此页面中 。
在ASP.NET 4.0中设置ASP.NET路由的过程便是这样!然而,在ASP.NET 3.5 SP1中实现上述过程需求五个步骤,而不是二个步骤 。 三、生成路由 友爱的URL 在 缔造超链接或者把消费者通过Response.Redirect 步骤从一个网页导航到另一个页面时, 使用定义于Global.asax中的路由模式(而不是 使用它的实际名称来 引用ASP.NET页面模式)是 比较 事实的 取舍 。例如,有一个ViewProducts.aspx页面,其中有一个链接-通过此链接 可以返回到显示选定产品类别的全部产品信息,而这个产品类别链接到Categories/CategoryName,其中CategoryName是产品类别名,要显示的是此类别产品的信息 。此时,你 可以 使用Page.GetRouteUrl 步骤生成这些路由 友爱的URL.这个 步骤有许多重载版本,但最 方便的版本仅 接纳两个参数:路由名称和参数的值 。 例如,为了 获得返回到Categories/CategoryName页面的正确的URL, 可以 使用以下语法: Page.GetRouteUrl("View Category", new { CategoryName = CategoryName }); 在这里,"View Category"是定义于文件Global.asax中路由 规定的名称,而CategoryName是浮现在URL中的CategoryName参数的值 。另一个更具体的例子是: Page.GetRouteUrl("View Category", new { CategoryName = "Beverages" }); 另外,Response.Redirect 步骤还有另一个新的版本,名为Response.RedirectToRoute.像Page.GetRouteUrl 步骤一样,这个 步骤 可以 接纳路由名称和参数值, 而后将消费者重定向到适当的、路由 友爱的网址 。下面的示例演示了如何将消费者重定向到一个特定产品的视图: Response.RedirectToRoute("View Product", new { ProductName = ProductName }); 四、 论断 ASP.NET路由是.NET框架提供的一个 性能 壮大的库,通过它 可以实现URL与底层物理文件间的彻底解耦 。自从ASP.NET 3.5 SP1引入后,ASP.NET路由被初步 利用于开发ASP.NET MVC 利用程序 。 固然它也 可以用于Web窗体 利用程序中,然而配置它需求繁琐的步骤,而且看上去会造成 毋庸要和 反复的代码 。 ASP.NET 4.0中 加强了ASP.NET路由库,并针对Web窗体 利用程序提供了更加灵便的直观的 使用场景 支撑 。正如本文中你所看到的,把一个路由模式映射到ASP.NET页面 惟独求在Global.asax中增加几行代码,而不再需求 缔造一个自定义的路由 解决类 。在底层,ASP.NET路由库会自动把路由参数 保留到RouteData 集中中- 而后,你 可以从Page类中 拜访它 。而且,这些RouteData值也 可以通过像SqlDataSource和ObjectDataSource这样的数据源控件以申明进行 拜访 。 |