天天看點

《精通 ASP.NET MVC 4》----2.3 渲染Web頁面

本節書摘來自異步社群《精通 asp.net mvc 4》一書中的第2章,第2.3節,作者: 【美】adam freeman ,譯者: 李萍 , 徐燕萍 , 林逸 , 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

精通 asp.net mvc 4

前面例子的輸出并不是html,隻是一個字元串“hello, world”。為了産生一個對浏覽器請求進行響應的html,需要建立一個視圖(view)。

要做的第一件事是修改index動作方法,如清單2-3所示。

清單2-3 修改控制器以渲染一個視圖

清單2-3中的改動以黑體顯示。當從一個動作方法傳回一個viewresult對象時,便是在訓示mvc去渲染一個視圖。通過調用不帶參數的view方法來建立這個viewresult對象。這是告訴mvc——去渲染該動作的預設視圖。

如果此時運作這個應用程式,就可以看到mvc架構正試圖查找要使用的預設試圖,并顯示圖2-8所示的錯誤消息。

這個錯誤消息是很有幫助的,它不僅解釋了mvc未找到該動作方法的視圖,而且還顯示出它查找了哪些地方。這是mvc約定的另一個很好的例子:視圖是通過命名約定與動作方法相關聯的。這個動作方法叫作“index”,控制器叫作“home”。從圖2-8中可以看出,mvc試圖在“views”檔案夾中查找有這個名字的不同檔案。

為了建立一個視圖,停止調試器,右擊homecontroller.cs代碼檔案中的動作方法(在方法名上,或在方法體内),從彈出菜單選擇“添加視圖”,打開“添加視圖”對話框,如圖2-9所示。

去掉“use a layout or master page(使用布局或母版頁)”複選框。本例不使用布局,但讀者将在第7章看到布局的使用。點選“add(添加)”按鈕,visual studio将在views/home檔案夾中建立一個名為“index.cshtml”的視圖檔案。如果回看剛才圖2-8顯示的錯誤消息,就會發現這個新檔案是mvc試圖尋找的檔案之一。

提示:.cshtml檔案擴充名表示是一個由razor處理的c#視圖。mvc的早期版本建立在aspx視圖引擎之上,其視圖檔案擴充名為.aspx。

visual studio打開index.cshtml檔案以便編輯。讀者将看到該檔案主要含有html。不同的是,會看到類似下面的部分。

《精通 ASP.NET MVC 4》----2.3 渲染Web頁面

這是一個由razor視圖引擎來解釋的代碼塊。這是一個相當簡單的例子。它隻是告訴razor并未選用布局(此刻略去razor,稍後再回頭讨論)。現在,将清單2-4所示的黑體内容添加到index.cshtml檔案中。

清單2-4 添加到視圖的html

《精通 ASP.NET MVC 4》----2.3 渲染Web頁面

這一添加顯示了另一種簡單消息(用html标記顯示出來的消息,而不是前面那種由動作方法顯示的字元串消息——譯者注)。從“debug(調試)”菜單選擇“start debugging(開始調試)”來運作該應用程式,并測試此視圖。讀者可以看到類似于圖2-10所示的内容。

《精通 ASP.NET MVC 4》----2.3 渲染Web頁面

在最初建立index動作方法時,它傳回了一個字元串值。這意味着,mvc除了把這個字元串傳遞給浏覽器之外,未做其他事情。現在,index方法傳回了一個viewresult,這是訓示mvc渲染一個視圖并傳回html。清單2-4并未告訴mvc應該使用哪個視圖,其實它運用了命名約定,以自動找到一個視圖。這個約定是,視圖具有動作方法的名字,并位于以控制器命名的檔案夾之中——~/views/home/index.cshtml。

除了字元串和viewresult對象之外,還可以從動作方法傳回其他結果。例如,如果傳回一個redirectresult,可以使浏覽器被重定向到另一個url。如果傳回一個httpunauthorizedresult,會強迫使用者進行登入。這些對象統稱為動作結果(action result),而且它們都是從actionresult類派生而來的。動作結果系統使開發者能夠封裝并重用動作中的常用響應。随着本書的進展,将介紹更多内容,并示範一些複雜的運用。

一個web應用程式平台的全部目标是構造并顯示動态輸出。在mvc中,控制器的工作是構造一些資料,并将其傳遞給視圖,而視圖負責把它渲染成html。

注意:現在,有很多人都把“渲染”說成“呈現”,其實這種說法是不正确的。web頁面從伺服器到浏覽器的整個呈現過程實際上分為三步。第一步是通過視圖引擎對視圖檔案進行解析,将視圖檔案中的代碼轉換成html标記,這一步叫作渲染。第二步是将渲染後的html标記傳遞給用戶端浏覽器,這一步是頁面的傳遞。第三步是浏覽器接收到html後對其進行處理并呈現為web頁面,這一步才叫作呈現。由此可見,渲染是把頁面的非html代碼(控件、頁面代碼等)轉換成html标記,這一步工作是由伺服器完成的。而呈現是将html顯示成web頁面,這一步工作是由浏覽器完成的。渲染和呈現是整個頁面處理過程的兩個不同階段,更不能把這兩步工作混談為隻有“呈現”這麼一步——譯者注

把資料從控制器傳遞給視圖的一種方式是使用viewbag(視圖包)對象,它是controller基類的一個成員。viewbag是一種動态對象,可以給它賦任意屬性,使這些屬性的值在随後渲染的視圖中可用。清單2-5示範了在homecontroller.cs檔案中以這種方式傳遞一些簡單的動态資料。

清單2-5 設定一些視圖資料

将一個值賦給viewbag.greeting屬性時,便是為視圖提供資料。viewbag是一種動态對象,greeting屬性直到給其指派的那一刻才會存在——這讓使用者能夠以自如而流暢的方式将資料從控制器傳遞給視圖,而不必提前定義類。

在視圖中再次查閱viewbag.greeting屬性,便可獲得其資料值,正如清單2-6所示範的那樣,它顯示了對index.cshtml檔案所做的修改。

清單2-6 接收viewbag的資料值

《精通 ASP.NET MVC 4》----2.3 渲染Web頁面

添加到清單2-6的是一個razor表達式。當人們在控制器的index方法中調用view方法時,mvc架構會定位index.cshtml視圖檔案,并要求razor視圖引擎解析該檔案的内容。razor會尋找類似于在該清單中所添加的這種表達式,并處理它們。在此例中,處理該表達式意味着,在視圖中插入在動作方法中賦給viewbag.greeting屬性的值(這就是譯者前面所提到的視圖渲染過程——譯者注)。

對屬性名greeting沒有特别的要求,可以用任意屬性名來代替它,它會一樣工作。當然,通過對多個屬性指派,可以将多個資料值從控制器傳遞給視圖。通過運作該項目,可以看到第一個動态的mvc輸出,如圖2-11所示(請讀者體會“動态”二字:動作方法可以根據不同的情況動态地對greeting屬性賦不同的值,而視圖無須做任何修改,便可以動态地顯示出正确的資料——譯者注)。

《精通 ASP.NET MVC 4》----2.3 渲染Web頁面

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀