background image

于是这个

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