概述
通过添加Routing规则,使URL能够安装指定的规则发送HTTP请求,这种方式能够简洁、方便、有效、快速的实现对指定页面的访问或者参数的传递,更易于被用户理解该URL
MVC Routing之优
在不使用路由的 ASP.NET 应用程序中,对 URL 的传入请求通常映射到处理该请求的物理文件,如 .aspx 文件。 id=4 来确定要显示的内容类型。
另外,可以在 URL 模式中包含占位符,以便无需查询字符串,即可将变量数据传递到请求处理程序。
/Products/show/beverages 片断将被解释为应用程序中一个文件的路径。
关于Routing的详细介绍请移步
我要学ASP.NET MVC 3.0(三): 初识MVC Url映射潜规则Routing
URL 如何与路由匹配
将 URL 请求与路由匹配取决于以下所有条件:
-
包括在项目类型中的已经定义的路由模式或默认路由模式(如果有的话)。
-
Routes 集合中的顺序。
-
已经提供给路由的所有默认值。
-
已经提供给路由的任意约束。
-
是否定义路由来处理匹配物理文件的请求。
Routes 属性。
实例说明
假定您使用以下模式添加路由:
-
{controller}/{action}/{id}
-
products/show/{id}
http://server/application/products/show/bikes 的请求似乎能更好地匹配路由 2,但它是由路由 1 使用下列值处理的:
-
products。
-
show。
-
bikes。
例如,假定您使用以下模式添加路由:
-
month 使用默认值。
-
year 使用默认值。
但是,路由 1 中的默认值意味着将匹配同时适用于路由 2 的所有请求。
monthly/{report}/{year}/{month} 的常量来避免二义性。
相反,会将处理传递给 ASP.NET 页、Web 服务或其他 ASP.NET 终结点。
向MVC程序中添加路由
预先配置了默认的路由规则,该规则将调用您在Controller类中实现的操作方法。
MapPageRoute(String, String, String) 方法。
对映射路由的引用
RouteCollection.MapPageRoute 方法 (String, String, String)
路由的名称,
)
Route 对象。
下面的示例演示在 Global.asax 文件(该文件是在 MVC 应用程序的 Visual Studio 项目模板中定义的)中创建默认 MVC 路由的代码。
public static void RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}
protected void Application_Start()
{
//在程序启动的时候注册我们前面定义的Route规则
RegisterRoutes(RouteTable.Routes);
}
}
设置URL参数默认值
MapPageRoute(String, String, String, Boolean, RouteValueDictionary) 方法添加具有默认值的路由。
如下:MVC 应用程序的 Visual Studio 项目模板中默认 MVC 路由的代码
public static void RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}
protected void Application_Start()
{
//在程序启动的时候注册我们前面定义的Route规则
RegisterRoutes(RouteTable.Routes);
}
}
RouteCollection.MapPageRoute 方法 (String, String, String, Boolean, RouteValueDictionary)
路由参数的默认值)
返回类型为System.Web.Routing.Route将添加到路由集合的路由
自定义默认路由
如下代码:
public static void RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("",
"Category/{action}/{categoryName}",
"~/categoriespage.aspx",
true,
new RouteValueDictionary {{"categoryName", "food"}, {"action", "show"}});
}
show 的默认值)得到下表列出的结果。
|
URL |
参数值 |
|---|---|
|
/Category |
|
|
/Category/add |
|
|
/Category/add/beverages |
|
MapRoute(RouteCollection, String, String, Object, Object))可以指定默认值。
在 URL 模式中处理可变数量的段
下面的示例演示一个与未知数量的段匹配的路由模式。
query/{queryname}/{*queryvalues}
ASP.NET 路由处理 URL 请求时,在示例中演示的路由定义得到下表列出的结果。
|
URL |
参数值 |
|---|---|
|
/query/select/bikes/onsale |
|
|
/query/select/bikes |
|
|
/query/select |
queryvalues = Empty string |
添加路由约束
添加约束以确保 URL 参数包含将在应用程序中起作用的值。
IRouteConstraint 接口的对象。
总是将正则表达式视为不区分大小写。
Match 方法返回一个布尔值,该值指示参数值是否有效。
通过使用正则表达式可以规定参数格式,比如controller参数只能为4位数字:
new { controller = @"\d{4}"}
通过第IRouteConstraint 接口目前可以限制请求的类型.因为System.Web.Routing中提供了HttpMethodConstraint类, 这个类实现了IRouteConstraint 接口. 我们可以通过为RouteValueDictionary字典对象添加键为"httpMethod", 值为一个HttpMethodConstraint对象来为路由规则添加HTTP 谓词的限制, 比如限制一条路由规则只能处理GET请求:
httpMethod = new HttpMethodConstraint( "GET", "POST" )
完整的代码如下:
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的URL
new { controller = "Home", action = "Index", id = "" }, //参数默认值
new { controller = @"\d{4}" , httpMethod = new HttpMethodConstraint( "GET", "POST" ) }
);
当然我们也可以在外部先创建一个RouteValueDictionary对象在作为MapRoute的参数传入, 这只是语法问题.
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 |
结果 |
|---|---|
|
/US |
year 都是必需的。 |
|
/US/08 |
year 的约束需要 4 个数字。 |
|
/US/2008 |
|
public static void RegisterRoutes(RouteCollection routes)
{
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// URL匹配
// Details/list/CQ/100,200-3
routes.MapRoute(
"Details",
"Details/{action}/{city}/{price}-{star}",
new {controller = "Details", action = "list", city = "CQ", price = "-1,-1", star = "-1"},
new {city = @"[a-zA-Z]*", price = @"(\d)+\,(\d)+", star = "[-1-5]"}
);
// URL匹配
// Details/所有匹配
routes.MapRoute(
"Details",
"Details/{*values}",
new { controller = "Details", action = "default", id = "" }
);
// URL匹配
// Home/.
routes.MapRoute(
"Home",
"{*values}",
new { controller = "Home", action = "index" }
);
}
本节介绍路由不处理请求的一些情况。
找到匹配 URL 模式的物理文件
{controller}/{action}/{id}),路由也不处理该请求。
true 后,与定义的模式匹配的所有请求都将由路由处理。
为 URL 模式显式禁用路由
下面的示例演示如何阻止路由处理 WebResource.axd 文件的请求。
//忽略对.axd文件的Route,也就是和WebForm一样直接去访问.axd文件
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
http://www.cnblogs.com/lukun/ 联系我,非常感谢。