從新控制器存取模型的資料
作者: Rick Anderson
注意
本教學課程的更新版本 可在這裡 使用最新版本的 Visual Studio。 新的教學課程會使用ASP.NET Core MVC,這可針對本教學課程提供許多改善。
本教學課程可讓您了解 ASP.NET Core MVC 與控制器和檢視。 Razor Pages 是 ASP.NET Core 的新替代方案,這是頁面型程式設計模型,可讓建置 Web UI 變得更簡單且更具生產力。 建議您在嘗試使用 MVC 版本之前,先試試 Razor 頁面教學課程。 Razor 頁面教學課程:
- 比較容易學習。
- 涵蓋更多功能。
- 這是新應用程式開發的慣用方法。
在本節中,您將建立新的 MoviesController
類別,並撰寫程式碼來擷取電影資料,並使用檢視範本在瀏覽器中顯示。
在繼續進行下一個步驟之前,請先建置應用程式。 如果您未建置應用程式,您將會收到新增控制器時發生錯誤。
在方案總管中,以滑鼠右鍵按一下Controllers資料夾,然後按一下 [新增],然後按一下 [控制器]。
在 [ 新增 Scaffold ] 對話方塊中, 按一下 [具有檢視的 MVC 5 控制器],使用 Entity Framework,然後按一下 [ 新增]。
針對 Model 類別選取 [影片 (MvcMovie.Models) ]。
針對 [資料] 內容類別別 選取 [MovieDBCoNtext (MvcMovie.Models) ]。
針對控制器名稱,輸入 MoviesController。
下圖顯示已完成的對話方塊。
按一下 [新增] 。 (如果您收到錯誤,您可能在開始新增 controller.) Visual Studio 之前未建置應用程式,會建立下列檔案和資料夾:
- Controllers資料夾中的MoviesController.cs檔案。
- Views\Movies資料夾。
- 在新的Views\Movies資料夾中建立.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml 和 Index.cshtml。
Visual Studio 會自動建立 CRUD (建立、讀取、更新和刪除) 動作方法和檢視, (自動建立 CRUD 巨集指令方法和檢視稱為 scaffolding) 。 您現在有功能完整的 Web 應用程式,可讓您建立、列出、編輯和刪除電影專案。
執行應用程式並按一下 MVC Movie 連結, (或流覽至 Movies
控制器,方法是將 /Movies 附加至瀏覽器網址列中的 URL) 。 由於應用程式依賴 App_Start\RouteConfig.cs 檔案中所定義的預設路由 () ,因此瀏覽器要求 http://localhost:xxxxx/Movies
會路由傳送至控制器的預設 Index
動作方法 Movies
。 換句話說,瀏覽器要求 http://localhost:xxxxx/Movies
實際上與瀏覽器要求 http://localhost:xxxxx/Movies/Index
相同。 結果是空的電影清單,因為您尚未新增任何影片。
建立電影
選取 [ 新建] 連結。 輸入電影的一些詳細資料,然後按一下 [ 建立 ] 按鈕。
注意
您可能無法在 [價格] 欄位中輸入小數點或逗號。 若要支援非英文地區設定的 jQuery 驗證,這些地區設定使用逗號 (「,」) 小數點和非US-English日期格式,您必須包含 globalize.js 和特定 文化特性/globalize.cultures.js 檔案 (, https://github.com/jquery/globalize 才能使用 Globalize.parseFloat
) 和 JavaScript。 我將在下一個教學課程中示範如何執行這項操作。 現在,只要輸入如 10 之類的整數。
按一下 [ 建立] 按鈕會導致表單張貼到伺服器,其中電影資訊會儲存在資料庫中。 然後,系統會將您重新導向至 /Movies URL,您可以在清單中看到新建立的電影。
建立幾個電影項目。 嘗試 Edit、Details 和 Delete 連結,這些連結都可以正常運作。
檢查產生的程式碼
開啟 Controllers\MoviesController.cs 檔案,並檢查產生的 Index
方法。 使用 Index
方法的電影控制器部分如下所示。
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
// GET: /Movies/
public ActionResult Index()
{
return View(db.Movies.ToList());
}
控制器的要求 Movies
會傳回資料表中的所有 Movies
專案,然後將結果傳遞至 Index
檢視。 類別中的 MoviesController
下一行會具現化電影資料庫內容,如先前所述。 您可以使用電影資料庫內容來查詢、編輯和刪除電影。
private MovieDBContext db = new MovieDBContext();
強型別模型和 @model 關鍵字
稍早在本教學課程中,您已瞭解如何使用 ViewBag
物件將資料或物件傳遞至檢視範本。 ViewBag
是動態物件,可提供方便的晚期繫結方式,以將資訊傳遞至檢視。
MVC 也提供將 強 型別物件傳遞至檢視範本的能力。 這個強型別方法可讓您在 Visual Studio 編輯器中更妥善地檢查程式碼和更豐富的 IntelliSense 。 Visual Studio 中的 Scaffolding 機制使用此方法 (,也就是在建立方法和檢視時,使用 MoviesController
類別和檢視範本傳遞強型別模型) 。
在 Controllers\MoviesController.cs 檔案中,檢查產生的 Details
方法。 方法 Details
如下所示。
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
參數 id
通常會當做路由資料傳遞,例如 http://localhost:1234/movies/details/1
會將控制器設定為電影控制器、動作設定為 details
,並將 id
設為 1。 您也可以使用查詢字串傳入識別碼,如下所示:
http://localhost:1234/movies/details?id=1
Movie
如果找到 ,模型實例 Movie
會傳遞至 Details
檢視:
return View(movie);
檢查 Views\Movies\Details.cshtml 檔案的內容:
@model MvcMovie.Models.Movie
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<h4>Movie</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Title)
</dt>
@*Markup omitted for clarity.*@
</dl>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
@Html.ActionLink("Back to List", "Index")
</p>
藉由在檢視範本檔案頂端加入 @model
語句,您可以指定檢視預期的物件類型。 當您建立電影控制器時,Visual Studio 會在 Details.cshtml 檔案的最上方自動包含下列 @model
陳述式:
@model MvcMovie.Models.Movie
這個 @model
指示詞可讓您使用強型別的 Model
物件,存取控制器傳遞至檢視的電影。 例如,在Details.cshtml範本中,程式碼會以強型 Model
別物件將每個電影欄位 DisplayNameFor
傳遞給 和DisplayFor HTML 協助程式。 Create
和 Edit
方法和檢視範本也會傳遞電影模型物件。
檢查MoviesController.cs檔案中的Index.cshtml檢視範本和 Index
方法。 請注意,程式碼在動作方法中 Index
呼叫 View
協助程式方法時,如何建立 List
物件。 程式碼接著會將此 Movies
清單從 Index
動作方法傳遞至檢視:
public ActionResult Index()
{
return View(db.Movies.ToList());
}
當您建立電影控制器時,Visual Studio 會自動在Index.cshtml檔案頂端包含下列 @model
語句:
@model IEnumerable<MvcMovie.Models.Movie>
這個 @model
指示詞可讓您使用 Model
強型別的物件來存取控制器傳遞至檢視的電影清單。 例如,在Index.cshtml範本中,程式碼會在強型 Model
別物件上執行 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", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
Model
因為物件是強型別 (做為 IEnumerable<Movie>
物件) , item
所以迴圈中的每個物件都會輸入為 Movie
。 除此之外,這表示您會在程式碼編輯器中取得程式碼的編譯時期檢查和完整的 IntelliSense 支援:
使用 SQL Server LocalDB
Entity Framework Code First 偵測到所提供的資料庫連接字串指向 Movies
尚未存在的資料庫,因此 Code First 會自動建立資料庫。 您可以藉由查看 [App_Data ] 資料夾來確認它是否已建立。 如果您沒有看到Movies.mdf檔案,請按一下方案總管工具列中的 [顯示所有檔案] 按鈕,按一下 [重新整理] 按鈕,然後展開[App_Data資料夾]。
按兩下 Movies.mdf 以開啟 [伺服器總管],然後展開 [ 資料表 ] 資料夾以查看 Movies 資料表。 記下識別碼旁的金鑰圖示。 根據預設,EF 會將名為 ID 的屬性設為主鍵。 如需 EF 和 MVC 的詳細資訊,請參閱 Tom Dykstra 有關 MVC 和 EF的絕佳教學課程。
以滑鼠右鍵按一下 Movies
資料表,然後選取 [ 顯示資料表資料 ] 以查看您所建立的資料。
以滑鼠右鍵按一下 Movies
資料表,然後選取 [ 開啟資料表定義 ],以查看 Entity Framework Code First 為您建立的資料表結構。
請注意資料表的 Movies
架構如何對應至您稍早建立的 Movie
類別。 Entity Framework Code First 會自動根據類別 Movie
為您建立此架構。
完成時,請以滑鼠右鍵按一下 MovieDBCoNtext 並選取 [ 關閉連線],以關閉連線。 (如果您未關閉連線,可能會在下次執行專案) 時收到錯誤。
您現在擁有一個資料庫和多個頁面,可用來顯示、編輯、更新和刪除資料。 在下一個教學課程中,我們將檢查其餘的 Scaffold 程式碼,並新增 SearchIndex
方法及 SearchIndex
檢視,讓您在此資料庫中搜尋電影。 如需搭配 MVC 使用 Entity Framework 的詳細資訊,請參閱 建立適用于 ASP.NET MVC 應用程式的 Entity Framework 資料模型。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應