1:ASP.NET 路由 http://msdn.microsoft.com/zh-cn/library/cc668201.aspx
简介:ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL。由于该 URL 不必映射到文件,因此可以使用对用户操作进行描述因而更易于被用户理解的 URL。 说的简单点,就是你访问的是 http://localhost/products/show/2012 他实际的地址我们只需要 http://localhost/productdesc.aspx?id=2012
URL 模式可以包含文本值和变量占位符(也称为“URL 参数”)。文本和占位符位于由斜杠 (/) 字符分隔的 URL 段中。
当生成请求时,URL 分析为段和占位符,变量值提供给请求处理程序。此过程类似于分析查询字符串中的数据并将该数据传递给请求处理程序的方法。在两种情况下,变量信息都包括在 URL 中并以键值对的形式传递给处理程序。对于查询字符串,键和值都位于 URL 中。对于路由,键是在 URL 模式中定义的占位符名称,只有值位于 URL 中。
在 URL 模式中,可以通过用大括号({ 和 })括住占位符来定义占位符。可以在一个段中定义多个占位符,但必须用一个文本值分隔开。例如,{language}-{country}/{action} 是有效的路由模式。但是,由于占位符之间没有文本值或分隔符,所以 {language}{country}/{action} 不是有效的模式。因此,路由无法确定在哪里将 language 占位符的值与 country 占位符的值分隔开。
下表演示有效的路由模式和一些与模式匹配的 URL 请求的示例。
在 Web 窗体应用程序中,通过使用 RouteCollection 类的 MapPageRoute(String, String, String) 方法来创建路由。MapPageRoute 方法创建 Route 对象,并将其添加到 RouteCollection 对象。可以在传递到 MapPageRoute 方法的参数中指定 Route 对象的属性。
通常情况下,您在 Global.asax 文件中 Application_Start 事件的处理程序调用的方法中添加路由。该方法可确保应用程序启动时路由可用。还使您能够在对应用程序进行单元测试时直接调用方法。如果您想在对应用程序进行单元测试时直接调用一个注册路由的方法,则该方法必须是静态的 , 并且必须具有一个 RouteCollection 参数。
下面的示例演示从 Global.asax 文件中添加一个 Route 对象的代码,该对象定义了名为 action 和 categoryName 的两个 URL 参数。具有指定模式的 URL 定向到名为 Categories.aspx 的物理页。
protected void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("", "Category/{action}/{categoryName}", "~/categoriespage.aspx"); }
定义路由时可以为参数分配一个默认值。如果 URL 没有包括该参数的值,则会使用默认值。通过将字典对象分配给 Route 类的 Defaults 属性,可以设置路由的默认值。下面的示例演示如何使用 MapPageRoute(String, String, String, Boolean, RouteValueDictionary) 方法添加具有默认值的路由。
void Application_Start(object sender, EventArgs e) { RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("", "Category/{action}/{categoryName}", "~/categoriespage.aspx", true, new RouteValueDictionary { { "categoryName", "food" }, { "action", "show" } }); }
ASP.NET 路由处理 URL 请求时,在示例中演示的路由定义(使用针对 categoryName 的 food 的默认值和针对 action 的 show 的默认值)得到下表列出的结果。
向路由添加约束
除了按照 URL 中的参数数量将 URL 请求匹配到路由定义中,还可以指定参数中的值满足特定约束。如果一个 URL 包含路由的约束以外的值,则该路由不用于处理请求。添加约束以确保 URL 参数包含将在应用程序中起作用的值。
约束是通过使用正则表达式或使用实现 IRouteConstraint 接口的对象来定义的。将路由定义添加到 Routes 集合时,同时也通过创建一个包含验证测试的 RouteValueDictionary 对象添加了约束。字典中的关键字标识约束适用的参数。字典中的值可以是表示正则表达式的字符串,也可以是实现 IRouteConstraint 接口的对象。
提供字符串后,路由将视字符串为正则表达式,并通过调用 Regex 类的 IsMatch 方法检查参数值是否有效。总是将正则表达式视为不区分大小写。有关更多信息,请参见 .NET Framework 正则表达式。
提供 IRouteConstraint 对象后,ASP.NET 路由将通过调用 IRouteConstraint 对象的 Match 方法检查参数值是否有效。Match 方法返回一个布尔值,该值指示参数值是否有效。
下面的示例演示如何使用 MapPageRoute 方法创建具有约束的路由,该约束限制可在 locale 和 year 参数中包括的值。(在 MVC 应用程序中,使用 MapRoute 方法。)
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("",
"Category/{action}/{categoryName}",
"~/categoriespage.aspx",
true,
new RouteValueDictionary
{{"categoryName", "food"}, {"action", "show"}},
new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}}
);
路由处理 URL 请求时,在上一示例中演示的路由定义生成下表列出的结果。
URL 如何与路由匹配
路由在处理 URL 请求时,还尝试将请求的 URL 与路由匹配。将 URL 请求与路由匹配取决于以下所有条件:
包括在项目类型中的已经定义的路由模式或默认路由模式(如果有的话)。
将路由添加到 Routes 集合中的顺序。
已经提供给路由的所有默认值。
已经提供给路由的任意约束。
是否定义路由来处理匹配物理文件的请求。
为避免错误的处理程序处理请求,必须在定义路由时考虑以上所有条件。出现在 Routes 集合中的 Route 对象的顺序是很重要的。路由将在集合的整个路由过程中一直尝试匹配。当匹配发生时,无法计算更多的路由。通常,按从路由定义的具体性递减的顺序将路由添加到 Routes 属性。
例如,假定您使用以下模式添加路由:
路由 1 设置为 {controller}/{action}/{id}
路由 2 设置为 products/show/{id}
路由 2 将不再处理请求,这是因为首先计算路由 1,路由 1 始终匹配同样适用于路由 2 的请求。对 http://server/application/products/show/bikes 的请求似乎能更好地匹配路由 2,但它却会被路由 1 使用下列值处理:
controller 为 products。
action 为 show。
id 为 bikes。
如果请求缺少参数,则会使用默认值。因此,可能导致路由匹配意外的请求。例如,假定您使用以下模式添加路由:
路由 1:{report}/{year}/{month},对于 year 和 month 使用默认值。
路由 2:{report}/{year},对于 year 使用默认值。
路由 2 将永远不处理请求。路由 1 可能用于月度报表,而路由 2 可能用于年度报表。但是,路由 1 中的默认值意味着将匹配同时适用于路由 2 的所有请求。
可以通过在模式中包括例如 annual/{report}/{year} 和 monthly/{report}/{year}/{month} 的常量来避免二义性。
如果 URL 与在 RouteTable 集合中定义的任何 Route 对象都不匹配,ASP.NET 路由将不处理请求。相反,会将处理传递给 ASP.NET 页、Web 服务或其他
ASP.NET 终结点。
2:演练:在 Web 窗体应用程序中使用 ASP.NET 路由 http://msdn.microsoft.com/zh-cn/library/dd329551.aspx
3: 如何:定义 Web 窗体应用程序的路由 http://msdn.microsoft.com/zh-cn/library/cc668177.aspx
4:如何:从路由创建 URL 通过路由构造 URL http://msdn.microsoft.com/zh-cn/library/cc668176.aspx (相当于是帮一个超链接,构造一个符合某一个路由规律的 url 地址,如果 路由规律改变了,那么将会自动生成匹配新路由规则的 Url地址 ) 官方定义为:利用 ASP.NET 的路由功能,您可以编程方式生成基于路由定义的 URL。指定参数值,并在需要时指定一个路由名称,然后 ASP.NET 将生成一个对应于匹配的路由的 URL 字符串。如果更改路由 URL 模式,则除非模式中的参数发生更改,否则您无需更改生成 URL 的代码或标记。
5:如何:在路由页面中访问 URL 参数 http://msdn.microsoft.com/zh-cn/library/dd535620.aspx (相当于是,你通过优化后的url传值过来了,那么在页面中,如何取出和使用这个值?如何在控件上 绑定这个值?) 官方定义:在使用路由的 ASP.NET Web 窗体应用程序中,URL 的某些段可以包含变量信息。请求处理程序(如 .aspx 页)以键值对集合的形式接收此信息,与接收查询字符串数据的方式类似。对于查询字符串,键和值都位于 URL 中。对于路由,键是在 URL 模式中定义的占位符名称,只有值位于 URL 中。可以使用代码或标记访问包含 URL 参数值的集合。
int year = Convert.ToInt32(Page.RouteData.Values["year"]) //检索路由参数并将其转换为整数值<asp:Label ID="Label1" runat="server" Text="<%$RouteValue:year%>" /> //显示一个在其 Text 属性中使用 RouteValue 表达式的 Label
6:ASP.NET 路由与 URL 重写的区别
ASP.NET 路由不同于 URL 重写。URL 重写通过在将请求发送到网页之前实际更改 URL 来处理传入请求。例如,一个使用 URL 重写的应用程序可能会将 URL 从
/Products/Widgets/ 更改为 /Products.aspx?id=4。此外,URL 重写通常没有相应的 API 来创建基于模式的 URL。在 URL 重写中,如果更改了 URL 模式,则必须手动更新包含原始 URL 的所有超链接。
由于 ASP.NET 路由可以从 URL 提取值,所以处理传入请求时不更改 URL。如果必须创建一个 URL,则将参数值传递到为您生成 URL 的方法中。若要更改 URL 模式,请在某位置更改该模式,您在应用程序中创建的基于该模式的所有链接将自动使用新模式。
上面的都是 微软 msdn 的官方解释和演示 下面是一位博客园的朋友 写的路由的演示,简单易懂
ASP.NET的路由系统:URL与物理文件的分离 http://www.cnblogs.com/artech/archive/2012/03/19/aspnet-routing-01.html