偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

ASP.NET MVC路徑選擇系統(tǒng)構(gòu)建

開(kāi)發(fā) 后端
本文深入討論asp.net mvc框架的路徑選擇(routing)架構(gòu)及一些定制方式,可以將其用于應(yīng)用中的一些更高級(jí)的場(chǎng)景。

從路徑選擇系統(tǒng)構(gòu)建輸出的URL

在本文的前面,我說(shuō)過(guò)ASP.NET MVC路徑選擇系統(tǒng)負(fù)責(zé)兩件事情:

把進(jìn)來(lái)的URL映射到處理的Controllers/Actions上

幫著構(gòu)建可以在以后用來(lái)回調(diào)Controllers/Actions的輸出到客戶(hù)端的URL(例如,表單提交, <  a href="">鏈接, 和 AJAX 調(diào)用等等)

URL路徑選擇系統(tǒng)有不少輔助方法和類(lèi),方便你在運(yùn)行時(shí)動(dòng)態(tài)查看和構(gòu)建URL(你也可以直接對(duì)RouteTable的Route集合進(jìn)行操作來(lái)查看URL)。

Html.ActionLink

在本博客系列的第一部分,我簡(jiǎn)單地討論了Html.ActionLink()視圖輔助方法。它可以在視圖里使用,允許你動(dòng)態(tài)地生成 <  a href=""> 超鏈接。比較酷的是,它可以使用MVC路徑選擇系統(tǒng)里定義的URL映射規(guī)則來(lái)生成這些URL。例如,下面2個(gè)Html.ActionLink 調(diào)用:

下面2個(gè)Html.ActionLink 調(diào)用 

automatically pick up the special Search results route rule we configured earlier in this post, and the "href" attribute they generate automatically reflect this: 會(huì)自動(dòng)地使用我們?cè)诒举N子前面配置的的特殊查詢(xún)結(jié)果路徑規(guī)則,它們自動(dòng)生成的href屬性反映了這個(gè)情況:

它們自動(dòng)生成的href屬性反映了這個(gè)情況  

特別地,注意上面,Html.ActionLink的第二個(gè)調(diào)用自動(dòng)地把page參數(shù)映射成URL的一部分(也注意,第一個(gè)調(diào)用省略了page參數(shù)值,因?yàn)樗婪?wù)器端會(huì)自動(dòng)提供默認(rèn)值)。

ASP.NET MVC路徑:Url.Action

除了使用Html.ActionLink外,asp.net mvc還有個(gè)Url.Action()視圖輔助方法。該方法生成原生的字符串URL,然后你可以任何方式來(lái)使用它們。例如,下面的代碼片段:

下面的代碼片段  

會(huì)使用URL路徑選擇系統(tǒng)返回下面這個(gè)原生的URL(而不是包裝在 <  a href=""> 元素里):

會(huì)使用URL路徑選擇系統(tǒng)返回下面這個(gè)原生的URL 

ASP.NET MVC路徑:Controller.RedirectToAction

asp.net mvc還提供了Controller.RedirectToAction()輔助方法,你可以在控制器里使用來(lái)進(jìn)行轉(zhuǎn)向操作(URL是使用URL路徑選擇系統(tǒng)計(jì)算出來(lái)的)。

例如,當(dāng)在控制器里調(diào)用下面代碼時(shí):

當(dāng)在控制器里調(diào)用下面代碼時(shí)  

在內(nèi)部,它會(huì)生成一個(gè)對(duì)Response.Redirect("/Search/Beverages")的調(diào)用。

DRY (別重復(fù)自己)

上述所有的輔助方法的好處在于它們?cè)试S我們避免在我們的控制器和視圖邏輯中硬寫(xiě)URL。如果在后來(lái)我們決定改變查詢(xún)URL路徑映射規(guī)則,從"/Search/[query]/[page]" 改回到 "/Search/Results/[query]/[page]" 或者 "/Search/Results?query=[query]&page=[page]" ,我們只要在一個(gè)地方(我們的路徑注冊(cè)代碼中)做編輯,就可以輕松搞定。我們不需要改動(dòng)視圖或控制器中的任何代碼,就可以撿起新的URL(這就堅(jiān)持了“DRY原則”)。

使用Lambda表達(dá)式從路徑選擇系統(tǒng)構(gòu)建輸出的URL

前面的URL輔助方法例子使用了VS 2008中VB和C#現(xiàn)在支持的新的匿名類(lèi)型。在上面的例子中,我們使用了匿名類(lèi)型來(lái)有效地傳入一串名稱(chēng)/數(shù)值對(duì),用以幫助映射URL(你可以把這想像為生成字典的一個(gè)比較干凈的方式)。

除了使用匿名類(lèi)型以動(dòng)態(tài)方式傳遞參數(shù)外, asp.net mvc框架還支持使用強(qiáng)類(lèi)型機(jī)制創(chuàng)建action路徑的能力,這些強(qiáng)類(lèi)型機(jī)制為URL輔助方法提供了編譯時(shí)檢查和intellisense。這是通過(guò)使用泛型和新的VB和C#對(duì)Lambda表達(dá)式的支持來(lái)實(shí)現(xiàn)的。

例如,下面這個(gè)匿名類(lèi)型 ActionLink 調(diào)用:

 下面這個(gè)匿名類(lèi)型 ActionLink 調(diào)用

也可以寫(xiě)成:

 也可以寫(xiě)成

除了寫(xiě)起來(lái)簡(jiǎn)短外,這第二個(gè)選項(xiàng)還有類(lèi)型安全的好處,這意味著你得到對(duì)表達(dá)式的編譯時(shí)檢查以及Visual Studio的代碼intellisense(你還可以使用重構(gòu)工具對(duì)它進(jìn)行重構(gòu)):

 這意味著你得到對(duì)表達(dá)式的編譯時(shí)檢查以及Visual Studio的代碼intellisense

注意上面,我們是如何使用intellisense挑選出我們想用的SearchController的Action方法的,以及參數(shù)是強(qiáng)類(lèi)型的。生成的URL都是由asp.net mvc url路經(jīng)選擇系統(tǒng)驅(qū)動(dòng)的。

你也許在想,這到底是怎么回事呢?如果你還記得,8個(gè)月前,我在博客里討論Lambda表達(dá)式時(shí),我談到了Lambda表達(dá)式既可以編譯出成代碼代理(delegate),也可以編譯成表達(dá)式樹(shù)對(duì)象,然后在運(yùn)行時(shí)可以用來(lái)分析Lambda表達(dá)式。對(duì)于Html.ActionLink<  T> 輔助方法,我們使用這個(gè)表達(dá)式樹(shù)選項(xiàng),然后在運(yùn)行時(shí)分析對(duì)應(yīng)的lambda,查出它調(diào)用的action方法以及相關(guān)的參數(shù)類(lèi)型,在表達(dá)式中指定的名稱(chēng)和值等。然后我們可以在MVC URL路徑選擇系統(tǒng)中使用這些信息, 返回合適的URL和相關(guān)聯(lián)的HTML。

重要注意事項(xiàng): 當(dāng)使用這Lambda表達(dá)式方法時(shí),我們實(shí)際上從不運(yùn)行對(duì)應(yīng)的Controller action方法。例如,下面的代碼并不調(diào)用我們的SearchController中"Results" action方法:

下面的代碼并不調(diào)用我們的SearchController中"Results" action方法 

實(shí)際上,它只是返回這個(gè)HTML超鏈接:

 它只是返回這個(gè)HTML超鏈接

如果這個(gè)超鏈接被用戶(hù)點(diǎn)擊的話,它會(huì)向服務(wù)器發(fā)回一個(gè)請(qǐng)求,該請(qǐng)求會(huì)調(diào)用SearchController的Results action方法。

單元測(cè)試路徑

asp.net mvc框架的一個(gè)核心設(shè)計(jì)原則是促進(jìn)很好的測(cè)試支持。 跟mvc框架的其他部分一樣,你可以輕松地單元測(cè)試路徑和路徑匹配規(guī)則。mvc路徑選擇系統(tǒng)可以獨(dú)立于asp.net生成實(shí)例和運(yùn)行,這意味著你可以在任何單元測(cè)試庫(kù)里裝載和單元測(cè)試路徑模式(而不用啟動(dòng)web服務(wù)器),可以使用任何單元測(cè)試框架(NUnit, MBUnit, MSTest等等)。

雖然你可以在你的單元測(cè)試中直接單元測(cè)試一個(gè)asp.net mvc應(yīng)用的全局RouteTable映射集合,但一般來(lái)說(shuō),讓單元測(cè)試改變或者依賴(lài)于一個(gè)全局的狀態(tài)不是一個(gè)很好的主意。一個(gè)你可以使用的較好的模式是,把你的路徑注冊(cè)邏輯放在一個(gè)象下面這樣的RegisterRoutes()輔助方法中,對(duì)作為參數(shù)傳入的RouteCollection進(jìn)行操作(注:我們也許會(huì)把這個(gè)模式在下個(gè)預(yù)覽版更新中做成默認(rèn)的VS模板模式):

 對(duì)作為參數(shù)傳入的RouteCollection進(jìn)行操作

然后,你可以編寫(xiě)單元測(cè)試,創(chuàng)建自己的RouteCollection實(shí)例,調(diào)用Application的RegisterRoutes輔助方法,在其中注冊(cè)應(yīng)用的路徑選擇規(guī)則。然后,你可以向應(yīng)用發(fā)出模擬請(qǐng)求,核實(shí)這些請(qǐng)求確有注冊(cè)了的正確的控制器和action方法,而不用擔(dān)心任何副作用:

創(chuàng)建自己的RouteCollection實(shí)例  

希望這個(gè)貼子提供了關(guān)于asp.net mvc路徑選擇架構(gòu)工作原理的一些細(xì)節(jié),以及你如何可以使用它來(lái)定制發(fā)布在你的asp.net mvc應(yīng)用中的url的結(jié)構(gòu)和布局。

在默認(rèn)情形下,在你創(chuàng)建一個(gè)新的asp.net mvc Web應(yīng)用時(shí),它會(huì)預(yù)先定義一個(gè)你可以使用的默認(rèn)的 /[controller]/[action]/[id] 路徑選擇規(guī)則,而不必手工配置或啟用什么。這應(yīng)該允許你不用注冊(cè)你自己的自定義路徑選擇規(guī)則,就可以建造許多應(yīng)用。但希望上面的內(nèi)容示范了,如果你想對(duì)你自己的url格式做自定義結(jié)構(gòu)的話,做起來(lái)并不難, mvc框架對(duì)此提供了許多的功能和靈活性。

【編輯推薦】

  1. 如何在IIS6.0中部署asp.net mvc程序
  2. 用Winform傻瓜式搭建asp.net mvc框架
  3. ASP.NET Session失效的編程思路
  4. ASP.NET Session 狀態(tài)的存儲(chǔ)
  5. 了解ASP.NET Web應(yīng)用程序模型

 

責(zé)任編輯:book05 來(lái)源: blog.joycode
相關(guān)推薦

2009-07-24 10:55:00

asp.net mvc

2009-07-24 11:20:43

ASP.NET MVC

2009-07-31 12:43:59

ASP.NET MVC

2009-07-24 13:20:44

MVC框架ASP.NET

2009-07-23 15:44:39

ASP.NET MVC

2009-07-22 13:24:24

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 10:09:59

ASP.NET MVC

2009-07-20 10:53:59

ASP.NET MVC

2009-07-23 11:33:18

2009-07-22 10:13:31

異步ActionASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-07-20 15:44:32

ASP.NET MVC

2009-04-01 12:00:43

ASP.NETMVC

2009-07-29 09:17:12

jQuery刪除

2010-06-23 15:44:03

ASP.NET MVC

2009-07-22 13:08:55

拯救UpdatePanASP.NET MVC

2009-07-24 11:33:12

MVC單元測(cè)試ASP.NET

2009-07-22 10:34:37

ActionInvokASP.NET MVC

2010-03-19 09:17:16

ASP.NET MVC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)