ASP.NET - Routing (路由) (for MVC, WebForm, WebAPI)

创建时间:
2015-06-09 23:01
最近更新:
2018-09-17 11:07

Brief

  • System.Web.Routing Namespace 始于 .NET Framework 3.5,在 .NET Framework 4 与 4.5 中有增强。
  • 在 .NET Framework 4.5 下,可直接使用 System.Web.Routing Namespace,无需引用 DLL。

Resource - MSDN

  1. System.Web.Routing 命名空间 - 包含路由的扩展类

Resource

  1. http://zzk.cnblogs.com/s?w=routing
  2. ASP.NET 的路由
  3. ASP.NET WebForm 的路由
  4. ASP.NET4.0/VS2010 新变化 (3): WebForm 中也可以直接 URL 路由
  5. 认识 ASP.NET 3.5 MVC 路由 在 WebForm 项目中使用路由
  6. 如何在 WebForm 的 ASPX 应用中使用 ASPNET MVC2 的 route_mapping
  7. IIS URL 重写模块和 ASP.NET 路由组件比较

UrlRouting 的实现原理

通过 RouteTableRoutes 属性可以获取一个 RouteCollection 的单例模式,虽然在其中并没有判断值不存在时才初始化的单例的标志性行为,但是它是在 Application_Start 事件中进行初始化的,并且直到应用程序进程终结,所以是单例模式的。
通过以下方式将 Route 添加到 RouteTable.Routes 中:

RouteTable.Routes.Add(new Route(...));

在 WebSite 中使用 System.Web.Routing

如需在 WebSite 中使用 System.Web.Routing,只需在 Global.asax 文件的 Application_Start 事件中用 System.Web.Routing.RouteTable.Routes.MapPageRoute() 注册路由规则即可。在代码中可通过 Page.RouteData.Values[key] 来获取路由参数值。

获取路由数据

In Controller

RouteData.Route.GetRouteData(this.HttpContext).Values["controller"]
RouteData.Route.GetRouteData(this.HttpContext).Values["action"]
or:
RouteData.Values["controller"]
RouteData.Values["action"]
RouteData.Values["id"]

In View

ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["id"]
or:
Html.ViewContext.RouteData.Values["id"]
or:
ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"]
ViewContext.RouteData.Route.GetRouteData(this.Context).Values["action"]

以下为 D:\Test\Cms\trunk\Cms\Cms\Views\Shared\_Navigation.cshtml 中的生产代码:

@{
	//Get当前页3个主要的RouteData:
	var routeDataController = ViewContext.RouteData.Values["controller"] as string;
	var routeDataAction = ViewContext.RouteData.Values["action"] as string;
	var routeDataId = ViewContext.RouteData.Values["id"] as string;
    ...
}

IN ASP.NET page

Page.RouteData.Values["id"]
this.RouteData.Values["id"]

In ASP.NET UserControl

this.Page.RouteData.Values["id"]

Common

Request.RequestContext.RouteData.Values["id"]

Traditional

如果获取 URL 中其他参数 (除 Controller 和 Action),传统的 ASP.NET WebForm 获取参数值的方法依旧可用,例如 request["参数名"] 等。或者:

System.Collections.Specialized.NameValueCollection col = filterContext.HttpContext.Request.QueryString;

//因为 NameValueCollection 不能直接被遍历,所以需要两层 foreach 获取到所有 key 和 value:
foreach (string key in col.AllKeys) {
    foreach (string value in col.GetValues(key)) {
        rtn += "key" + key + " |value" + value;
    }
}
filterContext.Controller.ViewData["sqlFilter"] = rtn;

以上代码中,获取到的 key 和 value 都被放入了 ViewData["sqlFilter"] 中,在页面中打印 ViewData["sqlFilter"] 即可查看所有参数。

让 ASP.NET MVC 路由处理指定后缀名的请求

在 Web.config 文件中进行配置即可实现。
以下 4 种写法均可实现:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<system.webServer>
		<!--plan 1:-->
		<modules runAllManagedModulesForAllRequests="true" />
		<handlers>
			<!--plan 2-->
			<add name="do" path="*.do" verb="*" type="System.Web.Routing.UrlRoutingModule" />
			<!--plan 3-->
			<add name="do" path="*.do" verb="*" type="System.Web.Routing.UrlRoutingHandler" />
			<!--plan 4-->
			<add name="do" path="*.do" verb="*" type="System.Web.Routing.UrlRoutingHandler, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
		</handlers>
	</system.webServer>
</configuration>

相关示例备份:

<httpHandlers>
	<add verb="*" path="*.mvc" type="System.Web.Mvc.MvcHandler, System.Web.Extensions, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>
<httpModules>
	<add name="UrlRoutingModule" type="System.Web.Mvc.UrlRoutingModule, System.Web.Extensions, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpModules>

Note:
<add name="do" path="*.do" verb="GET" type="System.Web.Routing.UrlRoutingModule" /> 中的 GET 必须是大写,否则报错 "HTTP 错误 404.0 - Not Found"。