天天看點

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

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

前述示例的輸出并不是html——隻是一個字元串<code>“hello world”</code>。為了産生一個對浏覽器請求進行響應的html,則需要一個視圖(view)。

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

清單2-3 在<code>homecontroller.cs</code>檔案中修改控制器,以渲染一個視圖

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

如果此時運作該應用程式便可以看到,<code>mvc</code>架構正試圖查找要使用的預設視圖,并顯示如圖2-9所示的錯誤消息。

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

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

建立視圖最簡單的方法是要求visual studio來做這件事。在<code>homecontroller.cs</code>檔案的代碼編輯視窗中定義<code>index</code>動作方法的任意地方右擊,然後從彈出的菜單中選擇<code>“add view</code>(添加視圖)”,如圖2-10所示。

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

visual studio将顯示<code>“add view(添加視圖)”</code>對話框,讓你配置待建立視圖檔案的初始内容。将<code>“view name(視圖名)”</code>設定為<code>“index”(與該視圖相關聯的動作方法的名稱,這是另一個約定)</code>,将<code>“template(模闆)”</code>設定為<code>“empty (without model)”(空模闆無模型)</code>,讓<code>“create as a partial view(建立為分部視圖)”</code>和<code>“use a layout page(使用布局頁)”</code>複選框處于未選狀态,如圖2-11所示。此時不必急着了解這些選項的含義,在後面的章節中将有詳細解釋。單擊<code>“add(添加)”</code>按鈕,建立這一新的視圖檔案。

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

visual studio将在<code>views\home</code>檔案夾中建立一個名稱為<code>“index.cshtml”</code>的視圖檔案。如果未得到這一結果,請删除已建立的檔案,再重試一次。這是mvc架構的另一個約定:視圖被放置在views檔案夾中,檔案夾的結構是與其關聯的控制器名稱相對應的。

提示:

<code>.cshtml</code>檔案擴充名表明這是一個由razor進行處理的c#視圖。mvc的早期版本依托于aspx視圖引擎之上,其視圖檔案的擴充名為.aspx。

上述“add view(添加視圖)”對話框中所選擇的值的結果是讓visual studio建立最基本的視圖,其内容如清單2-4所示。

清單2-4 index.cshtml檔案的初始内容

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

visual studio會打開這一個<code>index.cshtml</code>檔案,以便編輯。可以看出,該檔案主要含有html語句。不同的是,會看到如下所示的部分。

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

這是一個将由razor視圖引擎進行解釋的表達式,razor引擎處理視圖内容并生成發送給浏覽器的html。這是一個簡單的razor表達式,它告訴razor未選用布局,布局類似于發送給浏覽器的html模闆(将在第5章中描述)。此刻打算先忽略razor,稍後再回過頭來讨論。現在對<code>index.cshtml</code>檔案添加一些内容,如清單2-5中的黑體所示。

清單2-5 在index.cshtml中添加到視圖的html

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

這一添加顯示了另一條簡單消息(用html标記顯示出來的消息,而不是前面那種由動作方法顯示的字元串)。從<code>“debug(調試)”</code>菜單中選擇<code>“start debugging(開始調試)”</code>,以運作該應用程式并測試該視圖,看到的情況應該類似于圖2-12。

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

在最初編輯index動作方法時,它傳回的是一個字元串值。這意味着mvc除了把這個字元串值傳遞給浏覽器之外,未做其他事情。現在,index方法傳回了一個<code>viewresult</code>,mvc架構渲染了一個視圖并傳回了它所産生的html。清單2-4并未告訴mvc應該使用哪一個視圖,是以它會運用命名約定自動尋找一個視圖。該約定是,視圖具有動作方法的名稱,并包含在以控制器命名的檔案夾之中:<code>views/home/index.cshtml。</code>

除了字元串和<code>viewresult</code>對象之外,也可以從動作方法傳回其他結果。例如,如果傳回一個<code>redirectresult</code>,浏覽器将被重定向到另一個url。如果傳回一個<code>httpunauthorizedresult</code>,會強迫使用者進行登入。這些對象統稱為動作結果(action result),它們都派生于<code>actionresult</code>類。動作結果系統使開發者能夠在動作中封裝并重用常用的響應,第17章将對其做更多介紹并示範一些更複雜的運用。

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

注:

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

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

清單2-6 在<code>homecontroller.cs</code>檔案中設定一些視圖資料

當對<code>viewbag.greeting</code>屬性進行指派時,便是為視圖提供資料。<code>greeting</code>屬性直到對其指派的那一刻才會形成——這讓作者能夠以自如而流暢的方式将資料從控制器傳遞給視圖,而不必提前定義類。在視圖中再次查閱<code>viewbag.greeting</code>屬性,便可獲得其資料值。正如清單2-7所示範的那樣,它顯示了對<code>index.cshtml</code>檔案所做的相應更改。

清單2-7 在<code>homecontroller.cs</code>檔案中接收<code>viewbag</code>的資料值

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

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

對屬性名稱<code>greeting</code>沒有特别的要求,用任意屬性名來代替,照樣會正常工作,隻要在控制器中使用的名稱與視圖中使用的名稱相比對即可。當然,通過對多個屬性指派,可以将多個資料值從控制器傳遞到視圖。啟動該項目,可以看到這些修改的效果,如圖2-13所示。

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

繼續閱讀