精通MVC3摘譯 7 處理輸出 1

2021-09-03 10:22:08 字數 4484 閱讀 5978

處理輸出

controller完成處理請求後,通常需要生產響應。當我們直接實現 icontroller 介面建立controller時,我們就需要對處理請求的各個方面負責,包括對客戶端的響應。如果我們需要生成html響應。比如,我們需要建立組合html資料,並使用使用 response.write方法傳給客戶端。相似的,如果我們想給使用者瀏覽器返回另乙個url,我們需要呼叫response.redirect方法,直接傳遞url。這些方法都在下面列出:

當你從controller類中繼承了乙個controller,你就使用相同的方法。當你通過controller.response屬性,在execute方法鮮中讀取requestcontext.httpcontext.response屬性時,你得到的返回值是httpresponsebase類。如下:

using system.web.mvc;

namespace controllersandactions.controllers , action: ", controller, action));

// ... or ...

response.redirect("/some/other/url");

這個方法也是可行的,但是有幾個小問題:

controller類必須包含html或者url結構的詳細資訊。這就讓類的可讀性和可維護性變差。

對controller單元測試變的困難,你需要建立模擬的response資訊,使之能從controller接受並處理輸出,這意味著要轉換html關鍵字,這都是很痛苦的過程。

對每個請求都用這種方法處理非常乏味,而且容易出錯。一些程式設計師喜歡絕對控制,喜歡建立乙個未處理過的controller,但是大多數程式設計師對這種方法很不習慣。

幸運的是,mvc framework能很好的處理這些問題,這個功能叫做action results。下面會介紹action result的概念,並展示幾種不同的從controller生成響應的方法。

理解action results

mvc並不直接和response物件互動,而是返回乙個actionresult類的子類,以此描述我們想從controller中得到的響應,比如呈現檢視或者跳轉到url或者另乙個action方法。

注意,action result系統只是command模式的乙個例項。更多資訊,看 pattern。

當mvc framework從action方法中收到乙個actionresult物件,它會呼叫這個類所定義的executeresult方法。這個action result就會處理response物件。生成符合你意圖的輸出。乙個簡單的關於redirectresult 類的例子。如下。mvc framework開源的乙個好處是,你可以看到背後的工作方式。我們簡化了這個類,使之容易讀懂。

public class redirectresult : actionresult , action: ", controller, action));

public actionresult redirect() ;)這是乙個完美的可行的方法,但是我們哈市偏向使用controller類中定義的簡便方法。

/areas//views//.aspx

/areas//views//.ascx

/areas//views/shared/.aspx

/areas//views/shared/.ascx

/areas//views//.cshtml

/areas//views//.vbhtml

/areas//views/shared/.cshtml

/areas//views/shared/.vbhtml

你可以看到,framework查詢的序列中有aspx檢視引擎建立的view,即使我們指定了razor。framework有人會查詢c#和visual basic.net razor模板。mvc framework會依次檢查這些檔案是否存在,只要有乙個匹配了,就會使用這個view作為action方法的結果來呈現。

如果你沒有使用area,或者你使用了area但是要呈現的檔案不在上述清單中,那麼framework會使用下面的位址繼續查詢「

/views//.aspx

/views//.ascx

/views/shared/.aspx

/views/shared/.ascx

/views//.cshtml

/views//.vbhtml

/views/shared/.cshtml

/views/shared/.vbhtml

同樣的,只要mvc找到乙個匹配項,就停止搜尋,這個找到的view就作為對客戶端的響應。

mvc framework查詢目錄順序也是乙個約定的配置,你不需要註冊view檔案。你只需要把它們放在正確的地方,framework會找到它們的。防止view的這種約定也是可以配置的,在後續會講到。

我們可以在更進一步,在呼叫view方法時,忽略掉想要呈現的view的名字。如下**

using system.web.mvc;

namespace controllersandactions.controllers {

public class examplecontroller : controller {

public viewresult index() {

return view();

當我我們這麼做的時候,mvc framework假設我們需要呈現的view和action方法的名字是一致的。意思就,上例中的view方法的呼叫會開始查詢命名為index的檢視。注意,這樣做的結果就是mvc framework會尋找和action方法同名的view,但是view的名字事實上由routedata.values["action"]的值決定。

view 有多個過載方法,分別可以在建立的viewresult物件屬性上設定不同的值。比如,你可以顯式的覆蓋view的laout屬性,如下:

public viewresult index() {

return view("index", "_alternatelayoutpage");

使用view的路徑設定view

命名約定的方法非常簡潔,但是限制了你能呈現的view。如果你想要呈現乙個指定的view,你可以顯式的輸入路徑。如下:

using system.web.mvc;

namespace controllersandactions.controllers {

public class examplecontroller : controller {

public viewresult index() {

return view("~/views/other/index.cshtml");

當你如上那樣設定了view,路徑必須以/或者~/開頭,而且必須包含副檔名,比如cshtml。

從action方法中傳值給view

我們經常會從action方法中傳資料給view。 mvc framework提供很多方法來實現這種功能。這裡我們會討論一下,在後續我們還會深入討論。

提供view model物件

你可以通過view方法的引數傳遞物件給view,如下**:

public viewresult index() {

datetime date = datetime.now;

return view(date);

我們傳遞了乙個datetime物件作為view model。我們可以在view中,使用razor model關鍵字,訪問這個物件,如下:

viewbag.title = "index";

the day is: @(((datetime)model).dayofweek)

上述例子的view是無型別的或者弱型別的。view不知道任何關於view model物件的事情,它以object的例項來處理這model。(此處譯者測試下來,並不是object型別,而是dynamic型別,不知是為什麼)

要得到dayofweek屬性,必須轉換object型別到datetime。這雖然可行,但是有點麻煩。我們可以通過強型別view使**簡潔點,我們告訴view,它的view model的型別是什麼。如下**:

@model datetime

viewbag.title = "index";

the day is: @model.dayofweek

我們使用了razor的model關鍵字指定了view model的型別,注意當我們指定model型別的時候,使用了乙個小寫的m,而讀取值的時候用的是大寫的m。這不僅是我們的的**證件,也使得visual studio在強型別view中支援智慧型提示。如下:

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

路由系統非常靈活,但是如果這還不能滿足你的 需求,那麼,你可以定製路由系統。建立基於routebase的介面 getroutedata httpcontextbase httpcontext 這是乙個url匹配工作機制。framework依次在每個routetable.routes呼叫這個方法。直到...

AS3處理物件

as3處理物件 2009年07月14日 屬性 屬性表示某個物件中繫結在一起的若干資料塊中的乙個。song 物件可能具有名為 artist 和 title 的屬性 movieclip 類具有 rotation x width 和 alpha 等屬性。您可以像使用單個變數那樣使用屬性 事實上,可以將屬性...

python3 處理檔案

fhand open text.txt python裡面的open 函式返回乙個file handler,如果你print fhand 的話,得到一些跟檔案有關的資訊 name text.txt mode r encoding us ascii 今天實現了乙個讀取每一行,分別輸出並統計行數的功能 f...