精通MVC3摘譯 3 自定義路由系統

2021-09-22 00:27:26 字數 3893 閱讀 4515

路由系統非常靈活,但是如果這還不能滿足你的 需求,那麼,你可以定製路由系統。

建立基於routebase的介面

getroutedata(httpcontextbase httpcontext):這是乙個url匹配工作機制。framework依次在每個routetable.routes呼叫這個方法。直到其中乙個返回non-null值。

getvirtualpath(requestcontext requestcontext, routevaluedictionary values):  這是生成對外url的工作機制。

開始之前。我們需要建立乙個controller,這個controller能接受之前的request。我們把它命名為legacycontroller,如下:

using

system.web.mvc;  

namespace

urlsandroutes.controllers   

}  }  

這是乙個很簡單的controller,getlegacyurl action方法會將引數傳遞給view。如果我們要實現這個controller,我們需要使用這個方法來接受我們請求的檔案,但是現在是簡單的把這個url展現在view中。

注意,上面我們已經為view方法轉換了引數,view方法的其中乙個過載方法接受乙個string引數,該引數指定要顯示的view的名字,如果不轉變,那麼c#編譯器會認為我們是呼叫這個過載函式,為了避免這種情況,我們把它轉換成object,這樣的話我們可以呼叫呼叫另乙個過載函式,該過載函式使用預設的view,並且傳遞view model值。我們也可以使用另乙個過載方法,同時指定view name和view model,但這裡,我們不希望action方法和view直接顯式的關聯。

getlegacyurl.cshtml是和這個action關聯的view,顯示如下:

@model string  

@  <

h2>

getlegacyurl

h2>

the url requested was: @model  

這個例子非常簡單,我們只是演示自定義路由行為,所以我們不會去建立複雜的action和view。

路由接收到的url

建立legacyroute類,如下:

此類的建構函式,接受乙個string陣列,表示路由類將要支援的url,之後,我們會在註冊路由的時候指定它。上例中的getroutedata方法,路由系統會呼叫它,以此判斷是否要處理收到的url。如果我們不處理這個請求,那麼返回null,路由系統繼續判斷路由表中的下乙個記錄。如果可以處理,返回乙個routedata類的例項,該例項包含了controller和action變數。

當建立routedata物件,我們需要在handler中傳遞值,我們使用標準的mvcroutehandler類,此類指定了controller和 action的值:

result = new routedata(this, new mvcroutehandler());

對大多數的mvc應用程式來說,這個類是必須的,因為此類鏈結了路由系統和controller/action model。但是你可以實現乙個類代替mvcroutehandler。之後會講到。

在這個路由實現中,我們路由了任何傳遞到建構函式的url請求。當得到乙個url請求,我們為routevalues的controller和action方法硬編碼了一些值,傳遞了請求的url作為legacyurl的屬性。注意,屬性的名字和我們action方法的引數名一致,這樣保證了我們生成的值會通過引數傳遞給action方法。最後一步是用我們的routebase子類註冊乙個新的路由,如下**:

public static void registerroutes(routecollection routes) //",

new );

}我們實現了該類的例項,把我們想要路由的url傳給它。然後加入到routecollection集合。現在當我面請求乙個我們定義的legacy url,這個請求由我們的自定義類路由出來,並且定位到我們的controller。如下:

生成對外的url

要支援對外url的生成,我們需要實現getvirtualpath方法。同樣的,如果不能處理請求的,就通過返回null讓路由系統。否則就返回virtualpathdata的例項。

public override virtualpathdata getvirtualpath(requestcontext requestcontext,routevaluedictionary values)

return result;

}我們使用匿名型別傳遞了片段變數和其他引數,但是這背後的事情是,路由系統會將這些值轉換成routevaluedictionary物件。所以,比如,我們下面view中的**:

@html.actionlink("click me", "getlegacyurl", new )

和legacyurl屬性一起生產的匿名型別轉換成routevaluedictionary類,包含相同的名稱。在此類中,我們可以處理乙個對外的url請求,如果有個key命名為legacyurl,並且它的值是之前傳遞到建構函式的url值中的乙個。我們能進一步指定並檢測controller 和action的值,但是對這個例子來說,也已經足夠了。

如果我們得到乙個匹配,建立乙個新 virtualpathdata的例項,在引用中傳遞給當前物件和對外的url。我們使用了urlhelper類的content方法,轉換相對url,使之能被瀏覽器處理。可惜,路由系統會預先加了乙個額外的/在url上,所以我們必須小心的處理掉這個/。

建立自定義路由handler

在路由中,我們依賴的是mvcroutehandler,因為它鏈結了routing system和mvc framework。路由系統允許我們自定義我們的路由handler,通過實現iroutehandler 介面。如下:

iroutehandler介面的目的是提供乙個生成ihttphandler介面的方法,其中ihttphandler的作用是處理請求的。在此例中,非常簡單,只是輸出hello到client。我們在定義路由的時候可以註冊自定義的handler。如下:

public static void registerroutes(routecollection routes) //",

new );

}當請求url/sayhello,我們的handler會處理該請求。

你可以實現自定義路由handler意味著你自己要對那些常用的方法負責,比如controller和action的處理方式,但是這也給你更多自由。

精通MVC3摘譯 7 處理輸出 1

處理輸出 controller完成處理請求後,通常需要生產響應。當我們直接實現 icontroller 介面建立controller時,我們就需要對處理請求的各個方面負責,包括對客戶端的響應。如果我們需要生成html響應。比如,我們需要建立組合html資料,並使用使用 response.write方...

MVC3 自定義的錯誤頁

asp.net mvc3中如果配置檔案出錯了,怎麼跳轉到自定義的錯誤頁,現在參考網上的檔案是說 新增 如下配置檔案,並且在路徑views shared 下新增error頁面,測試下沒有用的,請大家看看有什麼好的建議啊,謝謝了啊!mvc根本不會理睬web.config中的customerrors,預設...

mvc3之自定義類實現路由配置和URL的生成

在mvc中路由的配置,直接關係著我們的請求訪問的控制器和方法 url對seo有著重要作用,全靠mvc內部定義的配置路由和生成url的方法在有的時間是不夠的,本文就來了解一下自定義配置路由和url的生成。在新建乙個mvc專案後,開啟global檔案,可以看到路由的註冊是使用乙個routecollect...