ASP.NET Core 中文文檔 第二章 指南(4.4)添加 Model

来源:http://www.cnblogs.com/dotNETCoreSG/archive/2016/06/16/aspnetcore-2_4_4-adding-model.html
-Advertisement-
Play Games

五月中旬 .NET Core RC2 如期發佈,我們遂決定翻譯 ASP.NET Core 文檔。我們在何鎮汐先生、悲夢先生、張仁建先生和雷歐納德先生的群中發佈了翻譯計劃招募信息,並召集到一群小伙伴。我們從六月開始翻譯文檔,目前已完成前兩章,並將按計劃以連載的方式逐篇公佈。當翻譯計劃完成後,所有文檔將... ...


原文:Adding a model
作者:Rick Anderson
翻譯:婁宇(Lyrics)
校對:許登洋(Seay)孟帥洋(書緣)姚阿勇(Mr.Yao)夏申斌

在這一節里,你將添加一些類來管理資料庫中的電影數據。這些類將成為 MVC 應用程式中的 “Model” 部分。

你將使用 .NET Framework 中名為 Entity Framework Core 的資料庫訪問技術來定義和使用這些數據模型類。Entity Framework Core (通常被稱為 EF Core) 有一種具有特色的被稱為 Code First 的開發模式。你先編寫代碼,然後通過這些代碼創建資料庫表。 Code First 允許你通過編寫一些簡單的類(也被稱為 POCO 類, "plain-old CLR objects." )來創建數據模型對象,然後根據你的類創建資料庫。如果你需要先創建資料庫,你仍然可以按照本教程來學習 MVC 和 EF 應用程式開發。

添加數據模型類

在解決方案資源管理器中,右鍵點擊 Models 文件夾 > 添加 > 。將類名命名為 Movie 並且添加以下屬性:

using System;

namespace MvcMovie.Models
{
    public class Movie
    {
        public int ID { get; set; }  //手動高亮
        public string Title { get; set; }
        public DateTime ReleaseDate { get; set; }
        public string Genre { get; set; }
        public decimal Price { get; set; }
    }
}

除了你用來構造電影的屬性,還需要一個 ID 欄位來作為資料庫主鍵。生成項目。如果你沒有生成這個應用程式,你將在下一節中遇到錯誤。我們終於為這個 MVC 應用程式添加了一個 Model 。

通過基架生成一個控制器(Controller)

解決方案資源管理器 中,右鍵點擊 Controllers 文件夾 > 添加 > 控制器

添加基架 對話框中,點擊 MVC Controller with views, using Entity Framework > 添加

完成 添加控制器(Add Controller) 對話框

  • 模型類(Model class): Movie(MvcMovie.Models)
  • 數據上下文類(Data context class): ApplicationDbContext(MvcMovie.Models)
  • 視圖(Views): 保持預設的選項
  • 控制器名稱(Controller name): 保持預設的 MoviesController
  • 點擊 添加(Add)

Visual Studio 基架引擎創建的東西如下:

  • 一個電影控制器(Controller)(Controllers/MoviesController.cs
  • Create、Delete、Details、Edit 以及 Index 的 Razor 視圖文件(Views/Movies)

Visual Studio 為你自動創建 CRUD(創建、讀取、更新以及刪除)Action 方法和視圖(View)(自動創建 CRUD Action 方法和 View 視圖被稱為 搭建基架(scaffolding))。很快你將擁有一個可以讓你創建、查看、編輯以及刪除電影條目的完整功能的 Web 應用程式。

運行這個應用程式並且點擊 Mvc Movie 鏈接。你將遇到以下錯誤:

這是一個很棒的錯誤消息,我們將通過這些指令準備好電影應用程式的資料庫。

使用數據遷移來創建資料庫

  • 在項目文件夾(MvcMovie/src/MvcMovie)打開命令提示符。按照以下說明,以一個快捷的方式打開項目文件夾

  • 打開一個在項目根目錄下的文件(在這個例子中,使用 Startup.cs )。
  • 右鍵點擊 Startup.cs > 打開所在的文件夾(Open Containing Folder)

  • Shift + 右鍵點擊一個文件夾 > 在此處打開命令視窗(Open command window here)

  • 運行 cd .. 將路徑退回項目文件夾

  • 在命令提示符中運行以下命令:

  dotnet ef migrations add Initial
  dotnet ef database update
  • dotnet (.NET Core) 是 .NET 的跨平臺實現。你可以在這裡瞭解它。
  • dotnet ef migrations add Initial 運行 Entity Framework .NET Core CLI 遷移命令並創建初始化遷移。參數 "Initial" 可以是任意值,但是通常用這個作為第一個(初始的) 資料庫遷移。這個操作創建了一個 Data/Migrations/2016_Initial.cs 文件,這個文件包含了添加(或刪除)Movie 表到資料庫的遷移命令。
  • dotnet ef database update dotnet ef database update 用我們剛剛創建的遷移來更新資料庫。

測試一下

  • 運行應用程式並點擊 Mvc Movie 鏈接
  • 點擊 Create New 鏈接並創建電影

註意
你也許不能在 Price 欄位中輸入小數點或逗號。為了實現對非英語環境中用逗號(",")來表示小數點,以及非美國英語日期格式的 jQuery 驗證,你必須採取措施國際化你的應用程式。查看額外的資源獲取更多的信息。現在僅僅輸入完整的數字,比如10。

點擊 Create 提交表單到伺服器,將電影數據保存到資料庫中。然後重定向到 /Movies URL ,你可以在列表中看到新創建的電影。

再創建幾個電影條目。嘗試 EditDetailsDelete 鏈接來執行各個功能。

檢查生成的代碼

打開 Controllers/MoviesController.cs 文件並檢查生成的 Index 方法。 MoviesController 中包含 Index 方法的部分如下所示:

public class MoviesController : Controller
{
    private readonly ApplicationDbContext _context;

    public MoviesController(ApplicationDbContext context)
    {
        _context = context;
    }

    public async Task<IActionResult> Index()
    {
        return View(await _context.Movie.ToListAsync());
    }

構造函數使用依賴註入將資料庫上下文註入到控制器(Controller)。 數據上下文在控制器(Controller)中被用來執行增刪改查(CRUD)方法。

一個到 MoviesController 的請求從 Movies 表返回所有的條目,然後傳遞數據到 Index 視圖 (View) 。

強類型模型與 @model 關鍵字

在之前的教程中,你看到了控制器(Controller)如何通過 ViewData 字典傳遞數據到一個視圖模板 (View Template)。ViewData 字典是一個動態類型對象,它提供了一種便捷的後期綁定方式將信息傳遞給視圖。

MVC 也提供了傳遞強類型數據給視圖模版的能力。這種強類型的方式可以提供給你更好的代碼編譯時檢查,併在 Visual Studio(VS) 中具有更豐富的智能感知。VS 中的基架機制在為 MoviesController 類創建方法(Action)和視圖(View)的時候就對採用了這種方式(即,傳遞強類型模型)。

檢查在 Controllers/MoviesController.cs 文件中生成的 Details 方法:

// GET: Movies/Details/5
public async Task<IActionResult> Details(int? id)
{
    if (id == null)
    {
        return NotFound();
    }

    var movie = await _context.Movie.SingleOrDefaultAsync(m => m.ID == id);
    if (movie == null)
    {
        return NotFound();
    }

    return View(movie);
}

id 參數一般作為路由數據傳遞,例如 http://localhost:1234/movies/details/1 將:

  • Controller 設置為 movies(對應第一個 URL 段)
  • Action 設置為 details(對應第二個 URL 段)
  • id 設置為 1(對應最後一個 URL 段)

你也可以向下麵一樣通過查詢字元串(Query String)傳遞 id

http://localhost:1234/movies/details?id=1

如果電影被找到了, Movie 模型(Model)的實例將被傳遞給 Details 視圖(View)。

  return View(movie);

檢查 Views/Movies/Details.cshtml 文件的內容:

@model MvcMovie.Models.Movie  <!--手動高亮-->

@{
    ViewData["Title"] = "Details";
}

<h2>Details</h2>

<div>
    <h4>Movie</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Genre)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Genre)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Price)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Price)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.ReleaseDate)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.ReleaseDate)
        </dd>
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>
        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>
    </dl>
</div>
<div>
    <a asp-action="Edit" asp-route-id="@Model.ID">Edit</a> |
    <a asp-action="Index">Back to List</a>
</div>

通過在視圖模板(View Template)文件頂部加入一個 @model 語句,你可以指定視圖(View)所期望的對象類型。當你創建這個 MoviesController 時, Visual Studio 自動在 Details.cshtml 頂部加入了 @model 語句後面的部分。

  @model MvcMovie.Models.Movie

@model 指令允許你訪問從控制器(Controller)傳遞給視圖(View)的這個強類型電影 Model 對象。例如,在 Details.cshtml 模板中,代碼用強類型 Model 對象傳遞所有的電影欄位到 DisplayNameForDisplayFor HTML 幫助類(HTML Helper)里。 CreateEdit 方法和視圖模板(View Template)也傳遞一個 Movie 模型(Model)對象。

檢查 Index.cshtml 視圖模板(View Template)和 MoviesController 里的 Index 方法。註意觀察代碼在調用 View 方法時,是如何創建一個 列表(List) 對象的。這段代碼將 Movies 列表從 Index Action 方法傳遞給視圖(View):

public async Task<IActionResult> Index()
{
    return View(await _context.Movie.ToListAsync());
}

當你創建這個 MoviesController 時,Visual Studio 自動在 Index.cshtml 頂部加入以下 @model 語句:

@model IEnumerable<MvcMovie.Models.Movie>

@model 指令允許你訪問電影列表這個從控制器(Controller)傳遞給視圖(View)的強類型 Model 對象。例如,在 Index.cshtml 模板中,代碼通過 foreach 語句遍歷了電影列表這個強類型的 模型(Model) 對象:

@model IEnumerable<MvcMovie.Models.Movie>   <!--手動高亮-->

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>
<p>
    <a asp-action="Create">Create New</a>
</p>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Genre)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Price)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ReleaseDate)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Title)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {    <!--手動高亮-->
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Genre)   <!--手動高亮-->
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)   <!--手動高亮-->
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ReleaseDate)   <!--手動高亮-->
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Title)   <!--手動高亮-->
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |         <!--手動高亮-->
                <a asp-action="Details" asp-route-id="@item.ID">Details</a> |   <!--手動高亮-->
                <a asp-action="Delete" asp-route-id="@item.ID">Delete</a>       <!--手動高亮-->
            </td>
        </tr>
}
    </tbody>
</table>

因為 模型(Model) 對象是強類型的(作為 IEnumerable<Movie> 對象),迴圈中的每一個 item 的類型被類型化為 Movie 。除了其他好處外,這意味著你將獲得代碼的編譯時檢查以及在代碼編輯器里得到完整的智能感知支持:

現在你有了資料庫和用於顯示、編輯、更新以及刪除數據的頁面。在下一篇教程中,我們將學習使用資料庫。

額外的資源

返回目錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 方法、函數、過程、靜態變數、類、結構體、構造函數、析構函數、運算符重載、索引器、類型轉換重載、嵌套類型 ...
  • 類 定義新的數據類型以及這些新的數據類型進行相互操作的方法 定義方式: C#中所有的類都是預設由object類派生來的,顯示指定或者省略效果是一樣的,所以上面的兩個例子是完全相同的。 C#中類包括:抽象類、密封類、非抽象類 abstract:表示修飾的類不完整,也就是抽象類,只能用做基類。 在使用是 ...
  • 本文目錄 Asp.net Core 對於授權的改動很友好,非常的靈活,本文以MVC為主,當然如果說webapi或者其他的分散式解決方案授權,也容易就可以實現單點登錄都非常的簡單,可以使用現成的IdentityServer框架或者自定義實現動非常方便和乾凈,如果你在運行示例代碼的時候未達到預期效果,請 ...
  • if語句、switch語句、Loops語句、Jump語句、格式輸出語句 ...
  • 在UWP淘寶與旺信中,筆者主要負責頁面與控制項的製作,這些工作看似簡單,但要想做的全面細緻仍然需要深入的思考。本文想分享一些在UWP旺信的製作過程中,筆者在UI頁面與控制項製作上體會到的一些心得。可能筆者的有些方法並不見得高明,或者仍需要時間的檢驗,所以也歡迎大家拍磚,共同進步。 UWP旺信是一個非常依 ...
  • 背水一戰 Windows 10 之 動畫: ThemeTransition 的概述, EntranceThemeTransition - 頁面間跳轉時的過渡效果, ContentThemeTransition - 內容改變時的過渡效果, RepositionThemeTransition - 位置改... ...
  • 目錄 前言 最近使用 "ABP(ASP.NET Boilerplate)" 做項目,有些查詢(或存儲過程)直接使用sql語句會更方便一點。 定義一個介面 在Core項目中定義一個介面,如:ISqlExecuter 實現介面 項目中使用的是EF,因此在EntityFramework項目中實現該介面 使 ...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Web; using System.Web.Cac ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...