在這一節中,你將新建立一個新的 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,發現添加的資訊仍能儲存,說明不是記憶體,下面就來說一下此問題。
Entity Framework代碼先行模式檢測到指向影片資料庫的連接字串不存在,則會自動建立資料庫。你可以通過查看App_Data檔案夾來確認資料庫已經被建立。如果你沒看到資料庫檔案,在方案總管工具列點擊“顯示所有檔案”按鈕重新整理按鈕,然後展開App_Data檔案夾,檔案名稱一般為“MvcMovie.Models.MovieDbContext.mdf”,雙擊此檔案,自動開啟伺服器總管,展開“表”檔案夾,會看到Movie表。
按右鍵Movie表,選擇“開啟表定義”,查看Entity Framework代碼先行為你建立的表結構
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類。Entity Framework代碼先行基於你的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.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/05/2803429.html
6. 查看Edit方法和Edit視圖
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view
· 譯文地址: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.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2805401.html
8. 為模型添加驗證
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/06/2806322.html
9. 查看Detail和Delete方法
· 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods
· 譯文地址:http://www.cnblogs.com/seawaving/archive/2012/12/10/2811064.html