在這一節中,你將新創建一個新的 MoviesController類,並編寫代碼,實現獲取影片數據和使用視圖模板在瀏覽器中展現影片數據的功能。
在進行下步之前,點擊“生成應用程序“對應用程序進行編譯。
右鍵單擊Controllers文件夾,新建一個名為“MoviesController ”的控制器。在創建窗口各選項如下圖所示
點擊添加,將創建以下文件和文件夾:
- 項目的 Controllers 文件夾下新增MoviesController.cs文件
- 項目的Views文件夾下新增Movies文件夾
- 在Views/Movies文件夾下創建了Create.cshtml, Delete.cshtml, Details.cshtml, Edit.cshtml, 和 Index.cshtml 五個文件。
ASP.NET MVC 4為你自動生成CRUD(創建、讀取、修改和刪除)操作方法和視圖(自動創建CURD操作方法和視圖常被稱為腳手架)。現在,你擁有了一個完整功能的web應用程序,可以顯示影片列表和詳細信息、創建影片、編輯影片和刪除影片。
譯者注:自動生成的按鈕和鏈接還是英文的,比如新建是“Create New”,很不爽,暫時先手工修改,后續找個一勞永逸的方法,推測要么是給mvc加語言包漢化,要么是修改mvc源碼實現,從界面來看,mvc已經漢化了,只是漢化的不夠完全而已,通過修改mvc源碼肯定可行,后面再說呵。
運行應用程序,在瀏覽器地址欄附加/Movies,訪問Movies控制器。因為應用程序依賴默認路由(在Global.asax文件中定義),瀏覽器請求 http://localhost:xxxxx/Movies被路由到默認的Movies控制器的Index操作方法。換句話說,瀏覽器請求 http://localhost:xxxxx/Movies與請求http://localhost:xxxxx/Movies/Index的效果是相同的。因為你沒有添加任何數據,所以當前影片列表是空的。
新建影片
譯者注:首先打開Index.cshtml,將@Html.ActionLink("Create New", "Create")修改為@Html.ActionLink("新建", "Create")。(找到對應的視圖模板文件修改即可,后續不再啰嗦)
點擊”新建“鏈接,進入影片編輯頁面,輸入各項內容后,點擊“新建”按鈕,會使表單送給服務器端,影片信息將會被保存到數據庫。返回到列表,你將看到剛剛被創建的影片出現在列表中。
注意:日期格式有后台驗證,輸入2012/12/05格式方能通過,橫杠的不行……
創建更多的影片實體,試一試編輯、詳情和刪除鏈接所有功能。
查看自動生成的代碼
打開Controllers\MoviesController.cs文件,查看下生成的Index方法
public ActionResult Index() { return View(db.Movies.ToList()); }
MoviesController 類聲明的下一行private MovieDBContext db = new MovieDBContext();是一個前面描述過的影片數據庫上下文對象,你可以使用這個對象查詢、編輯和刪除影片。
影片控制器收到請求后,返回數據庫影片表中所有實體並把結果傳給Index視圖。
強類型模型和@model關鍵字
在之前的教程中,學習過控制器如何通過ViewBag對象傳遞數據或對象給視圖模板。ViewBag是一個動態對象,提供便利的晚綁定方式來傳遞信息給視圖。ASP.NET MVC同時提供傳遞強類型數據或對象給視圖模板的能力。強類型方式更有利於編譯時檢測代碼和在Visual Studio編輯器中智能提示。Visual Studio的腳手架機制創建方法和視圖時,采用這種方式來處理MoviesController類和視圖模板。
查看下Controllers\MoviesController.cs文件中生成的Details方法。代碼如下:
public ActionResult Details(int id = 0) { Movie movie = db.Movies.Find(id); if (movie == null) { return HttpNotFound(); } return View(movie); }
如果找到影片,則影片模型的實例傳遞給Detail視圖。看一下Views\Movies\Details.cshtml 的文件內容。
通過在視圖模板文件頂部引入@model MvcMovie.Models.Movie語句,你可以指定視圖期望的對象類型。當你創建影片控制器時,Visual Studio自動在Details.cshtml文件頂部引入@model語句:
@model使你可以直接訪問控制器傳遞給視圖的強類型模型對象。例如,在 Details.cshtml 模板里,代碼使用強類型對象傳遞影片的每個字段給HTML Helpers 的DisplayNameFor和DisplayFor方法。Create和Edit方法及視圖模板同樣傳遞影片模型對象。
查看 Index.cshtml 視圖模板和MoviesController.cs文件中的Index方法。注意在Index方法中,被視圖Helper方法調用時,代碼如何創建列表對象。
public ActionResult Index() { return View(db.Movies.ToList()); }
當你創建影片控制器時,Visual Studio在Index.cshtml文件頂部自動引入以下@model語句:@model IEnumerable<MvcMovie.Models.Movie>
@model 語句使你可以直接訪問由控制器通過強類型對象傳遞過來的影片列表。例如,在Index.cshtml 模板里,代碼通過foreach遍歷強類型的模型對象
@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> <th> @Html.DisplayFor(modelItem => item.Rating) </th> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", { id=item.ID }) | @Html.ActionLink("Delete", "Delete", { id=item.ID }) </td> </tr> }
因為模型對象是強類型的( IEnumerable<Movie>對象),循環中的每個對象類型是Movie。這意味着編譯時檢測代碼和代碼編輯器中完全的智能提示。
使用Sql server 本地數據
譯者注:在上面例子中你可能會奇怪,填寫的影片信息究竟存放到哪里,內存嗎?重啟web,發現添加的信息仍能保存,說明不是內存,下面就來說一下此問題。
實體框架代碼先行模式檢測到指向影片數據庫的連接字符串不存在,則會自動創建數據庫。你可以通過查看App_Data文件夾來確認數據庫已經被創建。如果你沒看到數據庫文件,在解決方案資源管理器工具欄點擊“顯示所有文件”按鈕刷新按鈕,然后展開App_Data文件夾,文件名一般為“MvcMovie.Models.MovieDbContext.mdf”,雙擊此文件,自動打開服務器資源管理器,展開“表”文件夾,會看到Movie表。
右鍵單擊Movie表,選擇“打開表定義”,查看實體框架代碼先行為你創建的表結構
CREATE TABLE [dbo].[Movies] ( [ID] INT IDENTITY (1, 1) NOT NULL, [Name] NVARCHAR (MAX) NULL, [Genra] NVARCHAR (MAX) NULL, [Price] DECIMAL (18, 2) NOT NULL, [Date] DATETIME NOT NULL, CONSTRAINT [PK_dbo.Movies] PRIMARY KEY CLUSTERED ([ID] ASC) );
注意Movie表如何映射到你之前創建的Movie類。實體框架代碼先行基於你的Movie類自動創建表結構。結束查看,需要通過右鍵單擊MvcMovie.Models.MovieDbContext,選擇關閉連接。(如果不關閉連接,則下次運行項目時有可能出錯)。
現在創建了數據庫,並從中獲取數據顯示了簡單列表。在下一節課程中,我們將查看其余的腳手架生成的代碼並增加名為SearchIndex
方法和視圖用於查詢數據庫中影片信息。
譯者注:如何不使用本地數據庫,而是連接正式數據庫呢?其實在原英文教程的上節結尾說明過,當時覺得提出太突兀,譯者未在上節中翻譯出,在此補充。
MovieDbContext負責連接數據庫,映射影片對象到數據庫記錄。你可能會問一個問題,如何指定要連接哪個數據庫?該工作是通過在應用程序的Web.config 文件里增加連接信息來實現的。
打開應用程序根目錄下的Web.config文件(不是View文件夾下的Web.config文件),下面的例子展示了新的連接字符串被添加:
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcMovie-2012213181139;Integrated Security=true" providerName="System.Data.SqlClient" /> <add name="MovieDbContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
注意鍵值需要是MovieDbContext,與類名一致。
本教程所有文章導航
本系列共10篇文章,翻譯自Asp.Net MVC4 官方教程,由於本系列文章言簡意賅,篇幅適中,從一個示例開始講解,全文最終完成了一個管理影片的小系統,非常適合新手入門Asp.Net MVC4,並由此開始開發工作。
原文供9篇文章,譯者將其中第6篇拆成了2篇
1. Asp.Net MVC4 入門介紹
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/03/2800210.html
2. 添加一個控制器
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801949.html
3. 添加一個視圖
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/04/2801988.html
4. 添加一個模型
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803012.html
5. 從控制器訪問數據模型
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803429.html
6. 查看Edit方法和Edit視圖
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2804100.html
http://www.cnblogs.com/seawaving/archive/2012/12/06/2804590.html
7. 為Movie模型和庫表添加字段
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2805401.html
8. 為模型添加驗證
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2806322.html
9. 查看Detail和Delete方法
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/10/2811064.html