從新控制器存取模型的資料

作者: 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,然後按一下 [ 新增]。

顯示 [新增 Scaffold] 對話方塊的螢幕擷取畫面。已選取具有檢視的 M V C 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 相同。 結果是空的電影清單,因為您尚未新增任何影片。

顯示具有空白索引清單之 M V C 電影頁面的螢幕擷取畫面。

建立電影

選取 [ 新建] 連結。 輸入電影的一些詳細資料,然後按一下 [ 建立 ] 按鈕。

顯示 [建立電影] 頁面的螢幕擷取畫面。

注意

您可能無法在 [價格] 欄位中輸入小數點或逗號。 若要支援非英文地區設定的 jQuery 驗證,這些地區設定使用逗號 (「,」) 小數點和非US-English日期格式,您必須包含 globalize.js 和特定 文化特性/globalize.cultures.js 檔案 (, https://github.com/jquery/globalize 才能使用 Globalize.parseFloat ) 和 JavaScript。 我將在下一個教學課程中示範如何執行這項操作。 現在,只要輸入如 10 之類的整數。

按一下 [ 建立] 按鈕會導致表單張貼到伺服器,其中電影資訊會儲存在資料庫中。 然後,系統會將您重新導向至 /Movies URL,您可以在清單中看到新建立的電影。

顯示 [索引] 頁面的螢幕擷取畫面,其中已新增電影。

建立幾個電影項目。 嘗試 EditDetailsDelete 連結,這些連結都可以正常運作。

檢查產生的程式碼

開啟 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 協助程式。 CreateEdit 方法和檢視範本也會傳遞電影模型物件。

檢查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 支援:

ModelIntelliSense

使用 SQL Server LocalDB

Entity Framework Code First 偵測到所提供的資料庫連接字串指向 Movies 尚未存在的資料庫,因此 Code First 會自動建立資料庫。 您可以藉由查看 [App_Data ] 資料夾來確認它是否已建立。 如果您沒有看到Movies.mdf檔案,請按一下方案總管工具列中的 [顯示所有檔案] 按鈕,按一下 [重新整理] 按鈕,然後展開[App_Data資料夾]。

顯示方案總管視窗的螢幕擷取畫面。App Data 資料夾和 Movies dot m d f 子資料夾會以紅色圓圈。

按兩下 Movies.mdf 以開啟 [伺服器總管],然後展開 [ 資料表 ] 資料夾以查看 Movies 資料表。 記下識別碼旁的金鑰圖示。 根據預設,EF 會將名為 ID 的屬性設為主鍵。 如需 EF 和 MVC 的詳細資訊,請參閱 Tom Dykstra 有關 MVC 和 EF的絕佳教學課程。

DB_explorer

以滑鼠右鍵按一下 Movies 資料表,然後選取 [ 顯示資料表資料 ] 以查看您所建立的資料。

顯示 [伺服器總管] 視窗的螢幕擷取畫面。[電影] 以滑鼠右鍵按一下功能表隨即開啟。已選取 [顯示資料表資料],並以紅色圓圈顯示。

顯示 M V C 影片 Microsoft Visual Studio 視窗的螢幕擷取畫面。已選取 [d b o 點電影資料] 索引標籤。

以滑鼠右鍵按一下 Movies 資料表,然後選取 [ 開啟資料表定義 ],以查看 Entity Framework Code First 為您建立的資料表結構。

顯示 [伺服器總管] 視窗的螢幕擷取畫面。[電影] 以滑鼠右鍵按一下功能表隨即開啟。已選取 [開啟資料表定義],並以紅色圓圈。

顯示 M V C 影片 Microsoft Visual Studio 視窗的螢幕擷取畫面。已選取 [d b o 點電影設計] 索引標籤。

請注意資料表的 Movies 架構如何對應至您稍早建立的 Movie 類別。 Entity Framework Code First 會自動根據類別 Movie 為您建立此架構。

完成時,請以滑鼠右鍵按一下 MovieDBCoNtext 並選取 [ 關閉連線],以關閉連線。 (如果您未關閉連線,可能會在下次執行專案) 時收到錯誤。

顯示 [伺服器總管] 視窗的螢幕擷取畫面。[影片 D B 內容] 右鍵功能表隨即開啟。已選取 [關閉連線],並以紅色圓圈。

您現在擁有一個資料庫和多個頁面,可用來顯示、編輯、更新和刪除資料。 在下一個教學課程中,我們將檢查其餘的 Scaffold 程式碼,並新增 SearchIndex 方法及 SearchIndex 檢視,讓您在此資料庫中搜尋電影。 如需搭配 MVC 使用 Entity Framework 的詳細資訊,請參閱 建立適用于 ASP.NET MVC 應用程式的 Entity Framework 資料模型