溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

發(fā)布時(shí)間:2020-08-02 17:12:17 來(lái)源:網(wǎng)絡(luò) 閱讀:539 作者:匆匆的那年 欄目:軟件技術(shù)

1?起個(gè)頭

很多95后的程序員沒有搞明白MVC,需要多練習(xí)才行。

MVC實(shí)際上不是設(shè)計(jì)模式,而是架構(gòu)模式/體系結(jié)構(gòu)模式,體系結(jié)構(gòu)是老稱呼了,現(xiàn)在基本上都叫架構(gòu)了。


模型-視圖-控制器 (MVC) 體系結(jié)構(gòu)模式將應(yīng)用分成 3 個(gè)主要組件:模型 (M)、視圖 (V) 和控制器 (C)。 MVC 模式有助于創(chuàng)建比傳統(tǒng)單片應(yīng)用更易于測(cè)試和更新的應(yīng)用。

模型 (M):表示應(yīng)用數(shù)據(jù)的類。 模型類使用驗(yàn)證邏輯來(lái)對(duì)該數(shù)據(jù)強(qiáng)制實(shí)施業(yè)務(wù)規(guī)則。 通常,模型對(duì)象檢索模型狀態(tài)并將其存儲(chǔ)在數(shù)據(jù)庫(kù)中。

視圖 (V):視圖是顯示應(yīng)用用戶界面 (UI) 的組件。 此 UI 通常會(huì)顯示模型數(shù)據(jù)。

控制器 (C):處理瀏覽器請(qǐng)求的類。 它們檢索模型數(shù)據(jù)并調(diào)用返回響應(yīng)的視圖模板。 在 MVC 應(yīng)用中,視圖僅顯示信息;控制器處理并響應(yīng)用戶輸入和交互。 例如,控制器處理路由數(shù)據(jù)和查詢字符串值,并將這些值傳遞給模型。 該模型可使用這些值查詢數(shù)據(jù)庫(kù)。



1.1 MVC優(yōu)點(diǎn)

l?MVC 模式可幫助創(chuàng)建分隔不同應(yīng)用特性(輸入邏輯、業(yè)務(wù)邏輯和 UI 邏輯)的應(yīng)用,同時(shí)讓這些元素之間實(shí)現(xiàn)松散耦合。

l?該模式可指定應(yīng)用中每種邏輯的位置。 UI 邏輯位于視圖中。 輸入邏輯位于控制器中。 業(yè)務(wù)邏輯位于模型中。

l?這種隔離有助于控制構(gòu)建應(yīng)用時(shí)的復(fù)雜程度,因?yàn)樗捎糜谝淮翁幚硪粋€(gè)實(shí)現(xiàn)特性,而不影響其他特性的代碼。 例如,處理視圖代碼時(shí)不必依賴業(yè)務(wù)邏輯代碼



1.2 創(chuàng)建一個(gè)MVC項(xiàng)目

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


1.3 新增一個(gè)控制器

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


1.4 新增HTTP終結(jié)點(diǎn)調(diào)用

控制器中的每個(gè)?public?方法均可作為?HTTP?終結(jié)點(diǎn)調(diào)用。

HTTP?終結(jié)點(diǎn)是?Web?應(yīng)用程序中可定向的?URL(例如?https://localhost:44399/EdisonTest?),其中結(jié)合了所用的協(xié)議HTTPS?、TCP?端口等?Web?服務(wù)器的網(wǎng)絡(luò)位置?localhost:44399?,以及目標(biāo)?URI EdisonTest。

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享




基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


2?進(jìn)一步

2.1 路由


MVC 根據(jù)入站 URL 調(diào)用控制器類(及其中的操作方法)。 MVC 所用的默認(rèn) URL 路由邏輯使用如下格式來(lái)確定調(diào)用的代碼:

/[Controller]/[ActionName]/[Parameters]


Startup.cs 文件的 Configure 方法中設(shè)置路由格式。

如果瀏覽到應(yīng)用且不提供任何 URL 段,它將默認(rèn)為左邊紅線行中指定的“Home”控制器和“Index”方法。


第一個(gè) URL 段決定要運(yùn)行的控制器類。 localhost: 44399映射到 EdisonTestController 類。

第二個(gè) URL段決定類上的操作方法。 ?localhost:44399/EdisonTest/GetOwnerName 將觸發(fā) EdisonTestController 類的GetOwnerName 運(yùn)行。 請(qǐng)注意,只需瀏覽到 localhost:xxxx/EdisonTest ,而GetOwnerName 方法默認(rèn)調(diào)用。 原因是 GetOwnerName 是默認(rèn)方法,如果未顯式指定方法名稱,則將在控制器上調(diào)用它。

第三個(gè)URL ( id ) 針對(duì)的是路由數(shù)據(jù)。?

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

測(cè)試:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


2.2 增加參數(shù)

修改代碼,將一些參數(shù)信息從 URL 傳遞到控制器。

?基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

l?使用 C# 可選參數(shù)功能指示,未為 numTimes 參數(shù)傳遞值時(shí)該參數(shù)默認(rèn)為 1。

l?使用 HtmlEncoder.Default.Encode 防止惡意輸入(即 JavaScript)損害應(yīng)用。

l? $"I am Edison.Feng, you are {name}. Number of Times:{numTimes}"中使用內(nèi)插字符串。


測(cè)試:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


2.3 參數(shù)路由

參數(shù)也可以作為路由:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

測(cè)試:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


問(wèn)題1:路由的第三部分怎么解析的?

問(wèn)題2:路由的第三部分的問(wèn)號(hào)表示什么?

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



2.4 增加一個(gè)View視圖


目的:消除前面的硬編碼,不直接返回HTML文件內(nèi)容,而是返回視圖對(duì)象:

l?使用 Razor 視圖文件來(lái)順利封裝為客戶端生成 HTML 響應(yīng)。

l?使用 Razor 創(chuàng)建視圖模板文件。 基于 Razor 的模板具有“.cshtml”文件擴(kuò)展名。 它們提供了一種巧妙的方法來(lái)使用 C# 創(chuàng)建 HTML 輸出。

?

l?右鍵單擊Views”文件夾,然后單擊“添加”>“新文件夾”,并將文件夾命名為“EdisonTest”。

l?右鍵單擊Views/EdisonTest”文件夾,然后單擊“添加”>“新項(xiàng)”。

l?“添加新項(xiàng) - MvcMovie”對(duì)話框中

l?在右上角的搜索框中,輸入“視圖”

l?選擇Razor 視圖”

l?保持“名稱”框的值:getownername.cshtml。

l?選擇“添加”

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享




基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


修改視圖文件getownername.cshtml:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


修改默認(rèn)路由,Startup.cs:


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


修改控制器,增加一個(gè)get方法:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

測(cè)試:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


2.5 給視圖傳點(diǎn)數(shù)據(jù)


使用ViewData在視圖和控制器之間傳遞數(shù)據(jù):

(1)修改控制器

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

(2)修改視圖

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


(3)測(cè)試

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



3?數(shù)據(jù)庫(kù)操作


3.1 將真實(shí)的數(shù)據(jù)存在數(shù)據(jù)庫(kù)中,并取出來(lái)


l?結(jié)合 Entity Framework Core (EF Core) 使用這些類來(lái)處理數(shù)據(jù)庫(kù)。 EF Core 是對(duì)象關(guān)系映射 (ORM) 框架,可以簡(jiǎn)化需要編寫的數(shù)據(jù)訪問(wèn)代碼。

l?要?jiǎng)?chuàng)建的模型類稱為 POCO 類(源自“簡(jiǎn)單傳統(tǒng) CLR 對(duì)象”),因?yàn)樗鼈兣c EF Core 沒有任何依賴關(guān)系。 它們只定義將存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)的屬性。


3.2 新增一個(gè)模型Model


選中Models文件夾,右鍵菜單......


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


3.3 增加屬性


數(shù)據(jù)庫(kù)需要 Id 字段以獲取主鍵。

?

[DataType(DataType.Date)] DataType 屬性指定數(shù)據(jù)的類型 ( Date )。

通過(guò)此特性:

用戶無(wú)需在數(shù)據(jù)字段中輸入時(shí)間信息。

僅顯示日期,而非時(shí)間信息。

DataAnnotations



基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


3.4 “腳手架”工具

l?腳手架:Scaffold,或者翻譯為基架

l?.net core通過(guò)腳手架工具(Scaffolded Item)生成頁(yè)面,用于對(duì)模型Model執(zhí)行創(chuàng)建、讀取、更新和刪除?(CRUD)?操作


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


3.5 使用EF Core的視圖


l?模型類:選擇剛剛建好的模型類Movie

l?數(shù)據(jù)Context類:新建,默認(rèn)命名為MvcMovie1Context

l?視圖:默認(rèn)

l?控制器名稱:默認(rèn)

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



3.6 “搭建基架”過(guò)程自動(dòng)創(chuàng)建哪些文件?


l?EF Core數(shù)據(jù)庫(kù)Context類

l?控制器

l?Razor視圖文件(CRUD

l?Create

l?Index

l?Details

l?Edit

l?Delete


3.7 EF Core遷移功能


不使用EFCore遷移功能,只“搭建基架”則程序運(yùn)行提示SqlException:不能打開數(shù)據(jù)庫(kù)

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


l?初始遷移

l?進(jìn)入PMC(即程序包管理控制臺(tái))

l?輸入Add-Migration Initial并回車,生成用于創(chuàng)建初始數(shù)據(jù)庫(kù)架構(gòu)的代碼,數(shù)據(jù)庫(kù)架構(gòu)基于在 MvcMovieContext 類中指定的模型。Initial 參數(shù)是遷移名稱

l?輸入Update-Database并回車,在 Migrations/{time-stamp}_InitialCreate.cs 文件中運(yùn)行 Up 方法。Migrations/{time-stamp}_InitialCreate.cs用于創(chuàng)建數(shù)據(jù)庫(kù)

l?依賴注入

l?腳手架工具已經(jīng)把數(shù)據(jù)上下文類MvcMovie1Context注入到容器services

l?AddDbContext 指定數(shù)據(jù)庫(kù)和連接字符串

l?=>Lambda運(yùn)算符


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


l?數(shù)據(jù)上下文類為?Movie?模型協(xié)調(diào)?EF Core?功能

l?(創(chuàng)建、讀取、更新、刪除等)

l?實(shí)體集DbSet對(duì)應(yīng)數(shù)據(jù)庫(kù)的數(shù)據(jù)表

l?通過(guò)調(diào)用?DbContextOptions?對(duì)象中的一個(gè)方法將連接字符串名稱傳遞到上下文。

l?進(jìn)行本地開發(fā)時(shí),?ASP.NET Core?配置系統(tǒng) 在?appsettings.json?文件中讀取數(shù)據(jù)庫(kù)連接字符串。

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


3.8 CRUD: Details

l?Details方法

l?將強(qiáng)類型模型對(duì)象傳遞給視圖:憑借此強(qiáng)類型方法可更好地對(duì)代碼進(jìn)行編譯時(shí)檢查

l?FirstOrDefaultAsync返回滿足條件的第一個(gè)元素,或者在不滿足條件下的默認(rèn)元素

l?m => m.Id == id 元素的ID等于給定的ID

l?Details.cshtml

l?@model MvcMovie1.Models.Movie

l? 通過(guò)將 @model 語(yǔ)句包括在視圖文件的頂端,

l? 可以指定視圖期望的對(duì)象類型

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


3.9 CRUD: Index

l?Index方法

l?ToListAsync異步創(chuàng)建一個(gè)List

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


l?Index.cshtml

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


3.10 CRUD: Edit


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



3.11 CRUD: Create


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

3.12 CRUD: Delete



基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


4?擴(kuò)展更多的

4.1 數(shù)據(jù)庫(kù)連接字符串


l?DbContextOptionsBuilder.UseSqlServer

l?IConfiguration.GetConnectionString

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

l?AppSettings.json

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



3.2 SQL Server Express LocalDB

l?SQL Server對(duì)象資源管理器

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

l?視圖設(shè)計(jì)器

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


l?查看數(shù)據(jù)

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


4.3 數(shù)據(jù)庫(kù)種子


l?數(shù)據(jù)庫(kù)種子:沒有任何數(shù)據(jù)時(shí)初始化數(shù)據(jù)

l?修改Main方法

l?增加SeedData類


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

測(cè)試:

l?刪除數(shù)據(jù)庫(kù)的數(shù)據(jù)之后測(cè)試,如圖。

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

l?刷新數(shù)據(jù)庫(kù)后查看數(shù)據(jù)

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


4.4 修改顯示列表


l?修改列Title。

l?修改列數(shù)據(jù)顯示格式



基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



4.5 按標(biāo)題搜索

l?Index操作增加一個(gè)參數(shù)。

l?s => s.Title.Contains() 代碼是 Lambda 表達(dá)式

l?Lambda 表達(dá)式在基于方法的 LINQ 查詢中用作標(biāo)準(zhǔn)查詢運(yùn)算符方法的參數(shù),如 Where 方法或 Contains,在對(duì) LINQ 查詢進(jìn)行定義或通過(guò)調(diào)用方法(如 Where、Contains OrderBy)進(jìn)行修改前不會(huì)被執(zhí)行。這意味著表達(dá)式的計(jì)算會(huì)延遲,直到真正循環(huán)訪問(wèn)其實(shí)現(xiàn)的值或者調(diào)用 ToListAsync 方法為止。

l?Contains 方法在數(shù)據(jù)庫(kù)上運(yùn)行,而不是在 C# 代碼中運(yùn)行 ?

l?cshtml中綁定兩個(gè)input標(biāo)簽。

l??<form> 標(biāo)記使用表單標(biāo)記幫助器,提交表單時(shí)篩選器字符串會(huì)發(fā)布到電影控制器的 Index 操作。

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



l?增加一個(gè)POST Index操作

l?測(cè)試

l?不再出現(xiàn)過(guò)濾頁(yè)面

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



l?修改index.cshtml

l?測(cè)試:能夠轉(zhuǎn)到過(guò)濾頁(yè)面

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


4.6 按流派搜索

l?修改index操作方法

l?System.linq命名空間,有兩個(gè)靜態(tài)類:QueryableEnumerable

l?IQueryablewhere條件接收表達(dá)式,延遲執(zhí)行

l?IEnumerablewhere條件接收一個(gè)謂詞表達(dá)式(委托),立即執(zhí)行

l?SelectListSelectListItem的集合,和<select>標(biāo)簽聯(lián)合使用

l?修改index.cshtml

l?最上面一句改為:@model MvcMovie1.Models.GenreViewModel

l?Title: <input......上面增加:

l?<select asp-for="MovieGenre" asp-items="Model.Genres">

l?????????????<option value="">all</option>

l?????????</select>

l?修改Title: <input......Title: <input type="text" asp-for="searchString">

l?model.Title改為model.Movies[0].Title

l?model.ReleaseDate改為model.Movies[0].ReleaseDate

l?model.Genre改為model.Movies[0].Genre

l?model.Price改為model.Movies[0].Price

l?@foreach (var item in Model) {改為@foreach (var item in Model.Movies) {

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


4.7 增加新屬性

l?修改Models/Movie.cs

l?修改控制器

l?更新Create方法的[Bind]屬性

l?更新Edit方法的[Bind]屬性

l?修改Views/Movies/Index.cshtml

l?更新 /Views/Movies/Create.cshtml

l?更新 /Views/Movies/Edit.cshtml

l?更新 SeedData

l?更新數(shù)據(jù)庫(kù)

l?EF Core重建數(shù)據(jù)庫(kù)

l?對(duì)數(shù)據(jù)庫(kù)直接修改表結(jié)構(gòu)

l?使用Code First遷移(將新字段添加到模型,將新字段遷移到數(shù)據(jù)庫(kù))

l?進(jìn)入PMC

l?執(zhí)行Add-Migration Rating

l?Add-Migration 命令會(huì)通知遷移框架使用當(dāng)前 Movie DB 架構(gòu)檢查當(dāng)前 Movie 模型,并創(chuàng)建必要的代碼,將 DB 遷移到新模型。

l?名稱Rating”是任意的,用于對(duì)遷移文件進(jìn)行命名。 為遷移文件使用有意義的名稱是有幫助的。

l?執(zhí)行Update-Database

l?如果刪除 DB 中的所有記錄,初始化方法會(huì)設(shè)定 DB 種子,并將包括 Rating 字段。

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



4.8 預(yù)校驗(yàn)

如下圖,有如下幾種標(biāo)注:

l?Required

l?必需,缺少則返回400錯(cuò)誤

l?MinimumLength

l?最小長(zhǎng)度

l?RegularExpression

l?正則表達(dá)式

l?Range

l?范圍

l?StringLength

l?字串長(zhǎng)度

l?DataType

l?數(shù)據(jù)類型

l?需要禁用 jQuery 日期驗(yàn)證才能使用具有 DateTime Range 特性

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享



基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享


基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享




DRY原則是非常有用的:

基于.netcore的MVC應(yīng)用開發(fā)經(jīng)驗(yàn)共享

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI