概述

通过添加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}");
 
总结
 
废话就不多说了。。。
 
下节预告
 入手Controller与Action。。。。
 

http://www.cnblogs.com/lukun/  联系我,非常感谢。

相关文章: