ASP.NET MVC路由(二)
在上一篇中,提及了Route、RouteCollection對象的一些資訊,以及它們的結構所對應的關系。按照處理流程走下來還有遺留的疑問沒有解決這個篇幅就來講解一下。
Url規則看名字挺吓唬人的,其實就是根據我們自定義的Url來解析出一個模式,然後等待請求的Url來的時候,跟我們定義的模式進行比對(如下圖)。這是後續的内容。
在上篇中說到URL規則的定義是在Route對象中的,下面來講解在Route對象***趺錘萦沒ё⒉岬腢RL轉變成URL規則。
還是用前面的示例來示範,在前篇中說道,在MapRoute方法中的”{control}/{action}/{id}”參數部分代表着要指派到Route對象的Url屬***,也說過在指派Route對象的Url屬***時Set通路器還會做一些其它的操作。例如代碼1-1:
代碼1-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code> </code><code>1 </code><code>public</code> <code>class</code> <code>Route</code>
<code> </code><code>2 {</code>
<code> </code><code>3 </code><code>private</code> <code>string</code> <code>_url;</code>
<code> </code><code>4 </code><code>private</code> <code>ParsedRoute _parsedRoute;</code>
<code> </code><code>5 </code><code>public</code> <code>string</code> <code>Url</code>
<code> </code><code>6 {</code>
<code> </code><code>7 </code><code>get</code> <code>{ </code><code>return</code> <code>_url; }</code>
<code> </code><code>8 </code><code>set</code>
<code> </code><code>9 {</code>
<code>10 _url = value;</code>
<code>11 </code><code>//解析Value值</code>
<code>12 </code><code>this</code><code>._parsedRoute = RouteParser.Parse(value);</code>
<code>13 }</code>
<code>14 }</code>
<code>15 ……</code>
<code>16 }</code>
這裡隻是顯示了Route對象的一部分用于示範,在代碼1-1中,可以看出RouteParser類型負責把接收到的Url值轉換成ParsedRoute類型的對象。
這個ParsedRoute類型的對象是Route類型的内部私有類型,而轉換而成的Url模式資訊就存放在這個類型的對象執行個體中。請看圖1:
圖1
圖1所示,當一個Url值為&rdquo;{controller}/{action}&rdquo;指派到Route對象的Url屬***時,會由RouteParser内部類型的Parse()靜态方法來執行Url解析并且轉換成ParsedRoute内部類型,而ParsedRoute類型的構造函數是由PathSegment類型的集合構成。而在MVC架構中并不是使用PathSegment類型的,而是使用PathSegment類型的的派生類(如圖2),并且這些派生類分别對應着不同的Url片段,就好比示例的&rdquo;{controller}/{action}&rdquo;就會分别的表示為兩種類型(下面會講到)。
圖2
正如圖2所示的對象模型,按照圖2的模型結構。這個時候ParsedRoute内部所存的Url模式值為圖3所示,
圖3
如圖3所示上述示例中的&ldquo;controller&rdquo;生成為ContentPathSegment類型,而&ldquo;/&rdquo;則被生成為SeparatorPathSegment類型。對于這些類型的具體細節這裡就不做詳細的介紹了。目的在于隻是把内部的實作粗略的把對象模型說明一下,目的就是讓大家知道有這麼一個過程來生成URL規則,并且是什麼樣的一個實作的方式,讓大家知道Route對象的本身就是帶有URL規則的,在伺服器請求到來的時候是衆多Route對象根據自身攜帶的URL規則來進行比對,這部分内容後續說到。
如果感興趣想清晰的知道内部實作的具體,可以自己用反編譯工具來看裡面的源代碼,這部分的Url規則的生成過程就講到這裡。
希望看完後大家能夠記住大概的流程和這些對象在系統中的位置。會在下一篇幅講解RouteData的是怎麼根據請求的Url來比對生成的。
本文轉自jinyuan0829 51CTO部落格,原文連結:http://blog.51cto.com/jinyuan/1423994,如需轉載請自行聯系原作者