于是这个
url 是匹配的。
三、每个参数都符合
Constraints 的匹配规则。
满足上面三个条件后,
GetVirtualPath 就会将相应的参数填入 url 中,并最终返回 url 的
字符串。需要强调的一点是:
MVC 框架的这种行为工作在懒惰模式下,一旦“该要的要到
了
”,那么就停止继续遍历。这也从另一个角度说明了,把特殊的往前放的黄金原则。
# Y$ ?-
V: x% _$ P$ w5 A
举个例子:
下面是两个有顺序的
Route:
routes.MapRoute(
8 A' M" T5 D7 {. k3 @3 v! T
null,
) V* j8 q+ B! T' `
"manage/car",
new { controller =
1 v7 z" e$ ~$ H& |
"Admin", action =
"Car" }
8 ~8 p( A8 j- u6 n# @
);
* V9 m* @- Z' _" V/ p2 i% g
routes.MapRoute(
- I3 ]% O0 P2 k7 j/ U$ s3 j
null,
"manage/car/{operation}",
! H$ c6 _* s9 Q1 g' h' t. U$ H
new { controller =
"Admin", action =
) x/ e1 {! X% Q1 l$ y7 d, N; `
"Car" }
);
2 Q$ T' t& u6 e* S8 [8 O9 y3 T
, F& r3 a/ d- p, V/ @. [
有一个链接表示:
<%: Html.ActionLink(
"Add Car", "Car","Admin", new { operation =
3 G: [/ E: {4 {. D
"add" }, null )%>
( r& Y/ ]: t- b( }' w% I
- ?' C# {" W1 \$ {
最后的结果是什么呢
?是 manage/car/add 吗?
5 t) A: e( n+ W9 N' B$ z
其实最后的结果是
manage/car,为什么呢?对于第一个 Route,它期望的是 controller 和
action 这两个参数,而上面的 ActionLink 的确完整的提供了这两个参数,而且与 Defaults 设
置一致
(这满足规则的第二条),于是匹配了!即使还提供了 operation 参数,框架也不管了。
显然这不是希望的。只要把两个
Route 的位置换一下即可。这个例子只是一个演示。
*关于上面条件一的第二小点,其实是个很棒的特性,这里补充一个例子:
2 W1 x, ^'
c3 q& h; m7 s$ Z# y
假设当前页面的
url 是:
/Catalog/List/Purple/
123
- y- U# n. y( G1 _8 x
9 C2 |- u, W& d( n5 s8 T x0 T
routes.MapRoute(
null,
"{controller}/{action}/{color}/{page}");<%:
Html.ActionLink(
"Click me", "List", "Catalog", new {page=789}, null) %>
& R6 V; J: \) n9 n