本文地址http://www.cnblogs.com/outtamyhead/archive/2013/03/21/2973205.html,轉載需保留本地址
說在前面:
1、由於是頭次翻譯整本書籍,所以錯誤難免,希望大家都提出來,翻譯的不好還望大家少拍磚多鼓勵。
2、該系列沒有按照原文直譯,而是加入了我的一些言語在里面(在沒有改變原意的情況下),所以大家在看的時候希望有所對照。
3、該系列每周出一或二篇博客,因為我最近很忙,一直在加班,很累的說。
4、該系列不提供原版文字,希望看原版的可以自行下載Pdf。
5、該系列省去了前面的廢話,單刀直入,講主體內容。
第二章:第一個ASP.NET MVC4程序(中)
渲染Web頁面
前面的列子並不是從HTML輸出的---它只是“Hello World”字符串。要給瀏覽器請求產生一個HTML響應,我們需要添加一個視圖。
添加並渲染視圖
首先要做的就是修改我們的Index動作方法,如清單2-3。
清單2-3using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace PartyInvites.Controllers { public class HomeController : Controller { public ViewResult Index() { return View(); } } }
在清單2-3中更改的部分加粗顯示了。當我們從Action方法返回一個ViewResult,我們就已經命令MVC去渲染這個視圖了。我們通過調用View方法創建了一個無參的ViewResult。這也就告訴MVC為這個動作去渲染默認頁。
如果你在這個時候去運行程序,你會發現MVC框架會試圖找到一個默認頁去使用。如圖2-8所示的錯誤消息。
這個錯誤信息非常有幫助。它不僅告訴我們MVC不能為我們的動作方法找到合適的視圖並且告訴了我們MVC是在哪些地方來找這個視圖的。這是另一個關於MVC約定的很好的例證:視圖是通過命名約定來與動作方法關聯的。我們的動作方法叫做Index,我們的控制器叫做Home,並且我們可以從2-8中知道MVC試圖在【Views】文件夾中找到那些叫做Index的文件。
要添加一個視圖,那么就停止調試,然后在HomeController.cs代碼文件中在動作方法上右鍵(不論是在方法名上或者在方法體中),然后選擇【Add View】,這個菜單將打開【Add View】對話框,如圖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,而不一樣的地方看起來像這個:
@{ Layout = null; }
這是一個可以被Razor視圖引擎解析的表達式。這是一個小巧的例子。它僅僅告訴Razor我們沒有選擇母版頁。我們稍后再提Razor。把清單2-4中加粗的部分添加到Index.cshtml中。
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> Hello World (from the view) </div> </body> </html>
添加的部分用來顯示另一條簡單的消息。選擇【Start Debugging】來啟動程序並且來測試一下我們的視圖。你會看到與2-10中一些相似的東西。
當我們第一次編輯Index動作方法的時候,它返回了一個字符串。這說明MVC除了向瀏覽器傳遞了一個字符串之外沒有做任何事情。現在這個Index方法返回了一個ViewResult,我們命令MVC去渲染一個視圖並返回HTML。我們沒有告訴MVC哪個視圖是我們要用的,所以MVC依據命名約定找到了一個自動匹配的。這個約定就是視圖具有動作方法的名稱並且它位於以控制器命名的文件夾中---~/Views/Home/Index.cshtml。
除了字符串和ViewResult,我們可以從動作方法中返回其他的一些結果。例如,如果我們返回一個RedirectResult,我們就會使瀏覽器重定向到另外一個URL中。如果我們返回一個HttpUnauthorizedResult,我們將迫使用戶去登錄。
這些類統稱為動作結果,並且它們都是從ActionResult類派生的。動作結果系統能夠使我們封裝並重用在動作中的常用響應。本書中我們將讓你了解它們,並演示一些復雜的應用
添加動態輸出
一個Web平台全部的目標就是構建並顯示動態輸出。在MVC中,這份工作由控制器來擔任,它構造數據並傳遞到視圖中,而視圖負責渲染到HTML中。
有一種方法可以將數據從控制器傳遞到視圖中,那就是使用ViewBag,ViewBag是Controller基類中的成員。ViewBag是一個動態對象,你可以指定任意屬性,讓這些值在隨后要渲染的視圖中可用。在清單2-5中,在HomeController.cs中,用這種方法傳遞了一些簡單的動態數據。
清單2-5using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace PartyInvites.Controllers { public class HomeController : Controller { public ViewResult Index() { int hour = DateTime.Now.Hour; ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon"; return View(); } } }
當我們分配一個值給ViewBag.Greeting屬性時就給視圖提供了數據。ViewBag是動態對象的一個代表,Greeting屬性並不存在,直到我們分配一個值---這就允許我們在沒有定義類之前以一種自由流暢的方式從控制器傳遞值到視圖中。
我們在視圖中再次使用ViewBag.Greeting屬性來獲取數值,如清單2-6。
清單2-6@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> @ViewBag.Greeting World (from the view) </div> </body> </html>
添加到清單2-6中的是一個Razor表達式,當我們在控制器的Index方法中調用View方法,MVC框架會定位到Index.cshtml視圖並要求Razor視圖引擎去解析文件中的內容。Razor就會尋找到像我們添加的那個表達式並執行它們。在這個例子中,執行的表達式的含義是向我們分配的ViewBag.Greeting屬性插入值。
關於Greeting這個屬性名稱並沒有特別之處;你可以用其他任何一個屬性名稱來替換它並且它一樣會起效,而且我們可以通過分配多個屬性來實現從控制器到視圖傳遞多值的想法。我們可以通過運行項目來看一看我們的第一個動態MVC輸出,如圖2-11.