原文連結:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller
在這一小節,我們將會建立一個新的MoviesController類並且寫代碼來檢索movie有關的資料,最後使用視圖模板來進行展示。
在繼續下一步之前,然我們先將程式產生以下。
按右鍵Controllers檔案夾建立一個新的MovieController,如果你沒有先產生一下(按右鍵項目,Build)的話,下面這些選項是不會出現的:
- Controller name:MoviesController。
- Template:MVC Controller with read/write actions and views,using Entity Framework。
- Model class:Movie(MvcMovie.Models)。
- Data context class:MovieDBContext(MvcMovie.Models)。
- Views:Razor(CSHTML)。
點擊“Add”,Visual Studio將會建立如下的檔案和檔案夾:
- 在項目的Controllers檔案夾下建立MoviesController.cs檔案
- 在項目的Views檔案夾下建立Movies檔案夾。
- 在新的Views\Movies檔案夾下建立Create.cshtml,Delete.cshtml,Details.cshtml,Edit.cshtml和Index.cshtml
ASP.NET MVC 4會自動建立CRUD(create,read,update和delete)的action方法和視圖(自動建立crud action和視圖的行為被稱之為scaffolding)。現在我們有了一個完整功能的web應用,可以讓我們對電影資料進行建立,編輯,瀏覽和刪除。
運行程式通過在地址欄的URL後面添加/Movies來訪問MoviesController。因為我們的應用程式依賴於預設的路由規則(定義在Global.asax檔案裡),請求http://localhost:xxxx/Movies時會被自動路由到MoviesController的Index action方法。換句話說,請求http://localhost:xxxx/Movies和請求http://localhost:xxxx/Movies/Index是一樣的。返回的結果是一個空的列表,因為我們現在還沒有任何資料。
建立一個Movie
選擇Create New超連結。輸入一部電影的細節資料然後單擊Create按鈕。
單擊Create按鈕使表單提交到伺服器,伺服器會將movie的資料儲存到資料庫中。然後再次瀏覽/Movies,這次可以看到新添加的資料了。
多建立一些資料,試一試Edit,Details和Delete超連結,這些都是可用的。
來看看產生的程式碼
開啟Controllers\MoviesController.cs檔案來查看一下產生的Index方法。下面展示了MoviesController中的一部分代碼.
public class MoviesController : Controller { private MovieDBContext db = new MovieDBContext(); // // GET: /Movies/ public ActionResult Index() { return View(db.Movies.ToList()); }
下面的代碼執行個體化了一個前面提到過的MovieDbContext對象,是movie資料庫的上下文,你可以使用它了查詢,編輯和刪除資料。
private MovieDBContext db = new MovieDBContext();
對MoviesController的請求會返回資料庫中Movies表的所有資料並且將這些資料傳遞到Index的view中。
強型別模型和@model關鍵字
在前面的文章裡,我們知道了一個controller如何通過ViewBag對象來為View模板傳遞資料。ViewBag對象是一個動態對象,可以提供一種方便的,晚期綁定的方式來為view傳遞資料。
ASP.NET MVC同樣提供了為View模板傳遞強型別資料的能力。這種強型別資料提供了更好編譯時間的代碼檢查和Visual Studio的智能提示。scaffolding機制使用了這種方法來建立MoviesController和視圖模板中的方法和view。
在Controllers\MoviesController.cs檔案中查看產生的Details方法,MoviesController中Details方法的代碼如下。
//// GET: /Movies/Details/5 public ActionResult Details(int id = 0) { Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); }
如果能找到指定id的資料,一個Movie對象的執行個體就會傳遞給Deatils的視圖。來看一下Views\Movies\Details.cshtml檔案。
通過在視圖模板頂部引入@model語句我們可以指定視圖期望使用的物件類型。當我們建立Moviescontroller的時候,Visual Studio自動在Details.cshtml檔案的頂部包含了下面的語句
@model MvcMovie.Models.Movie
@model指令允許我們通過強型別的的Model對象來訪問Controller傳遞給View的電影資料。例如,在Details.cshtml模板裡,代碼中通過強型別的Model對象向DisplayNameFor和DisplayFor方法傳遞需要的Movie對象的資料。Create和Edit方法還有視圖模板中都是傳遞的Movie類型的Model對象。
讓我們仔細查看一下Index.cshtml和MoviesController.cs裡定義的Index方法裡的內容,注意一下Index方法中的代碼中在調用View方法時是如何建立List對象的,代碼把建立的List對象從controller傳遞到了view。
public ActionResult Index(){ return View(db.Movies.ToList());}
當建立MoviesController的時候,Visual Studio會自動在Index.cshtml頁面頂部添加@model語句
@model IEnumerable<MvcMovie.Models.Movie>
這條@model指令允許我們通過使用強型別的Model對象訪問controller傳遞給view的資料。例如,在Index.cshtml模板裡,代碼通過一個foreach語句遍曆Model對象。
@foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr>}
因為Model對象是強型別的(是IEnumerable<Movie>對象),在foreach迴圈中的item是Movie類型。這就是說我們可以獲得編譯時間安全檢查和VS的智能提示的支援。
與資料庫一起工作
註:原文使用Visual Studio 2012內建的Sql Server LocalDB資料庫,本文使用的是Visual Stuio 2010內建的Sql Server Express
Entity Framework的Code First模式會探測到資料庫連接字串指向了還不存在的Movies資料庫,所以Code First會自動建立這個資料庫。你可以通過查看App_Data檔案夾來驗證這一點。如果你看不到Movies.mdf檔案,單擊方案總管上方工具條中的"Show All Fiels"按鈕,單擊"Refresh"按鈕,然後展開App_Data檔案夾.
雙擊Movies.mdf來開啟資料庫瀏覽器,展開Tables檔案夾來看一下Movie表
按右鍵Movies表選擇"Show Table Data"來查看我們建立的資料
按右鍵Movies表,選擇"Open Table Definition"來看一下Entity Framework Code First來為我們建立的表結構
注意Movies表結構是如何與我們之前建立的Movie類對應起來的。Entity Framework Code First根據Movie類自動建立表結構.
當你完成這些操作的時候,按右鍵資料庫選擇"Close Connection",如果不這麼做的話,下次開啟項目可能會報錯.
現在我們有了一個簡單的頁面來展示資料庫裡的資料了。在下一篇文章裡,我們將會查看剩餘的自動產生的程式碼,並且添加一個SearchIndex方法和一個SearchIndex視圖來尋找資料庫裡的資料。