更新:2007 年 11 月
您使用 ASP.NET 路由处理未映射到网站中的物理文件的 URL 请求。您通过为 URL 定义模式并指定为响应请求而调用的处理程序来创建路由。
定义路由时,可以指定默认值,当 URL 请求中参数缺失时这些默认值能够提供可供使用的值。还可以指定约束,以确保参数包含有效的值。
可以使用路由在应用程序中生成 URL,例如为超链接动态创建 URL。构造 URL 时,可能会有多个路由定义与提供的参数匹配。可以通过提供注册路由时指定的路由的名称,来指定使用哪个路由创建 URL。
创建路由
创建一个与 URL 模式匹配的路由并指定如何处理对该 URL 模式的请求。
创建路由
向 Global.asax 文件添加一个创建 Route 类的实例的方法。在类构造函数中,将 url 参数设置为用于匹配 URL 请求的 URL 模式,并将 routeHandler 参数设置为处理该请求的类的实例。
如果希望将路由与 URL 请求匹配,则可以将一个“全部捕捉”参数添加到 URL 模式中,即使该请求包含的参数多于路由中定义的参数时也是如此。若要添加“全部捕捉”参数,请在最后一个参数的名称前加上星号 (*)。
如果要为路由参数指定默认值,请设置 Defaults 属性。
如果要验证路由参数值,请将 Constraints 属性设置为以下内容之一:
用于定义正则表达式的字符串。正则表达式不区分大小写。
用于实现 IRouteConstaint 接口且包含 Match 方法的对象。
将 Route 对象添加到 RouteTable 对象的 Routes 属性。如果要为此路由提供一个名称,请调用 Add 方法;否则,请调用 Add 方法。
在 Global.asax 文件的 Application_Start 处理程序中,调用在第一步中添加的方法。
示例
下面的示例演示从 Global.asax 文件的 Application_Start 中调用的 RegisterRoutes 方法。该方法添加两个具有年份和区域设置参数的 Route 对象。生成 URL 时,可以根据名称区分各个路由。此示例演示如何将这些路由添加为已命名路由。这些路由同时还具有约束、默认值以及“全部捕捉”参数。
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
RegisterRoutes(RouteTable.Routes)
End Sub
Shared Sub RegisterRoutes(routes As RouteCollection)
Dim salesUrlPattern As String
Dim expensesUrlPattern As String
Dim salesRoute As Route
Dim expensesRoute As Route
salesUrlPattern = "SalesReport/{locale}/{year}/{*queryvalues}"
salesRoute = New Route(salesUrlPattern, New SalesRouteHandler)
salesRoute.Constraints = New RouteValueDictionary(New With _
{.locale = "[a-z]{2}-[a-z]{2}", .year = "\d{4}"})
salesRoute.Defaults = New RouteValueDictionary(New With _
{.locale = "en-US", .year = DateTime.Now.Year.ToString()})
routes.Add("SalesRoute", salesRoute)
expensesUrlPattern = "ExpensesReport/{locale}/{year}/{*queryvalues}"
expensesRoute = New Route(expensesUrlPattern, New ExpensesRouteHandler)
expensesRoute.Constraints = New RouteValueDictionary(New With _
{.locale = "[a-z]{2}-[a-z]{2}", .year = "\d{4}"})
expensesRoute.Defaults = New RouteValueDictionary(New With _
{.locale = "en-US", .year = DateTime.Now.Year.ToString()})
routes.Add("ExpensesRoute", expensesRoute)
End Sub
protected void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add("SalesRoute", new Route
(
"SalesReport/{locale}/{year}/{*queryvalues}"
, new SalesRouteHandler()
)
{
Constraints = new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}},
Defaults = new RouteValueDictionary
{{"locale", "en-US"}, {"year", DateTime.Now.Year.ToString()}}
});
routes.Add("ExpensesRoute", new Route
(
"ExpensesReport/{locale}/{year}/{*queryvalues}"
, new ExpensesRouteHandler()
)
{
Constraints = new RouteValueDictionary
{{"locale", "[a-z]{2}-[a-z]{2}"},{"year", @"\d{4}"}},
Defaults = new RouteValueDictionary
{{"locale", "en-US"}, {"year", DateTime.Now.Year.ToString()}}
});
}