ASP.NETCore MVC 和 Visual Studio入門(二)新增控制器
ASP.NETCore MVC 和 Visual Studio入門(二) 新增控制器
Model-View-Controller(MVC) 結構模式將一個應用分離為三個主要部分:模型(M)、檢視(V)和控制器(C), MVC 模式有助於建立比傳統的一體式應用更易於測試和更新的應用,基於MVC的應用可包含:
模型:模型是代表應用中資料的類,這些模型類使用驗證邏輯加強資料的業務規則。通常,模型物件在資料庫中取出或存入模型狀態,在本教程中,一個電影模型從資料庫中取出電影資料並提供給檢視或對該資料進行更新,更新了的資料被寫入一個SQL Server資料庫。
檢視:檢視用於顯示應用的使用者介面(UI),通常地,檢視顯示的是模型資料。
控制器:控制器是處理瀏覽器請求的類,用於取得模型中的資料並呼叫返回響應的檢視,檢視僅負責顯示資訊,控制器僅處理並響應使用者的輸入及互動行為。如,控制器處理路由資料和查詢字串並傳遞給模型,模型使用這些資訊中的值查詢資料庫。例如,http://localhost:1234/Home/About中含有Home(控制器)和About(Home控制器可呼叫的行為方法)的路由資料。http://localhost:1234/ Movies /Edit/5是一個使用Movies控制器編輯 id為5的使用者的請求,路由資料將在後面進行討論。
MVC 模式有助於建立分離為不同方面(輸入邏輯、業務邏輯、UI邏輯)的應用,且這些方面之間是鬆耦合的,這種模式指定了應用中每種邏輯應該定位在哪裡,UI邏輯屬於檢視,輸入邏輯屬於控制器,業務邏輯屬於模型。 這種分離有助於在建立應用的過程中管理複雜性,使你能在一個時間內只致力於整個實現的一個方面,而且其程式碼不會與其他方面有衝突。比如,你可以致力於檢視程式碼,而不依賴於業務邏輯程式碼。
在本教程中,我們將論述所有這些概念並展示 如何使用它們構建一個簡單的電影應用,我們的MVC專案目前已包含了控制器和檢視的資料夾,我們將增加一個模型資料夾。
在解決方案瀏覽器(Solution Explorer)中,右擊Controllers>Add>New Item選單。
選擇 MVC Controller Class。在 Add New Item 對話方塊,輸入HelloWorldController.
用以下內容代替Controllers/HelloWorldController.cs中的內容:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace
MvcMovie.Controllers
{
public class
HelloWorldController :
Controller
{
// GET: /HelloWorld/
public string Index()
{
return
"This is my default action...";
}
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return
"This is the Welcome action method...";
}
}
}
控制器中的每一個公共方法稱為一個HTTP端點,在上面的這個例子中,兩個方法都返回一個字串,注意每個方法前的註釋。
web應用中的 HTTP 端點是一個可訪問目標的URL,例如 http://localhost:1234/HelloWorld包含了所使用的HTTP協議、web伺服器(包括TCP埠)的網路位置localhost:1234
、以及目標URI:HelloWorld
。
第一條註釋指出這是一個HTTP GET方法,該方法通過向基本的URL增加的"/HelloWorld/"呼叫。第二條註釋指出這是一個通過向基本的URL增加的"/HelloWorld/Welcome/"呼叫的HTTP GET方法。後面我們將使用支架引擎來產生HTTP POST 方法。
以非除錯模式(按Ctrl+F5)執行應用並在位址列向路徑追加"HelloWorld". (在下圖中,使用了 http://localhost:5000/HelloWorld,
但你的應用可能會使用一個與5000
不同的埠號。)Index
方法返回一個字串。你告訴系統返回一些HTML,系統照做了。
MVC 根據輸入的URL呼叫控制器類 (和其中的行為方法),MVC使用的預設的URL路由邏輯使用像這樣的格式來決定呼叫什麼程式碼:
/[Controller]/[ActionName]/[Parameters]
可在
Startup.cs檔案(位於解決方案瀏覽器中)中為路由設定格式。
app.UseMvc(routes =>
{
routes.MapRoute(
name:
"default",
template: "{controller=Home}/{action=Index}/{id?}");
});
如果你執行應用時不提供任何URL段,則會預設使用在上面template行中指定的Home控制器和Index方法,
第一個URL段決定要執行的控制器類,所以localhost:xxxx/HelloWorld
對映到HelloWorldController
類,URL段的第二部分決定呼叫類中的哪個方法,所以localhost:xxxx/HelloWorld/Index
將引發HelloWorldController
類的Index
方法被呼叫。注意我們僅需瀏覽localhost:xxxx/HelloWorld
,而
Index
方法將被預設呼叫,這是因為沒有明確指定方法的控制器將預設呼叫Index
方法。URL段的第三部分是路由的資料,路由資料將在後面介紹。
用瀏覽器開啟 http://localhost:xxxx/HelloWorld/Welcome
. Welcome
方法執行並返回字串"This is the Welcome action method...". 對於這個 URL, 控制器是HelloWorld
行為方法是Welcome
. 我們還沒有使用URL的[Parameters]
部分。
讓我們對範例進行輕微的改動以便於你可以從URL傳遞一些引數資訊給控制器(例如, /HelloWorld/Welcome?name=Scott&numtimes=4
)。 改變Welcome
方法,使之包括如下所示的兩個引數。注意,程式碼使用C#的引數可選功能來指示當numTimes
沒有被傳值時預設值為1
。
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode(
$"Hello {name}, NumTimes is: {numTimes}");
}
以上程式碼使用HtmlEncoder.Default.Encode
使應用避免惡意輸入(即
JavaScript),
同時,也使用了字串嵌入值(C# 6.0開始支援)。
In VisualStudio, in non-debug mode (Ctrl+F5), you don't need to build the app afterchanging code. Just save the file, refresh your browser and you can see thechanges.
在 Visual Studio中, 在非除錯模式下 (Ctrl+F5), 改變程式碼後你無需重新生成應用,只需儲存修改了的檔案,再重新整理瀏覽器就能看到改變了。
執行應用並用瀏覽器開啟:http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4
(用你的埠號代替 xxxx) ,你可以在URL中嘗試不同的名字和numtimes
,
MVC 模型約束系統自動從位址列的查詢字串對映輸入的引數給方法。更多見模型約束。
在以上的範例中,沒有使用了URL段 (Parameters
), name
和
numTimes
引數
作為查詢字串進行傳遞。上面的URL中的問號是一個分隔符,查詢字串跟隨其後,&
字元分隔查詢字串。
將Welcome
方法修改為如下的程式碼:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode(
$"Hello {name}, ID: {ID}");
}
執行應用並輸入如下的URL: http://localhost:xxx/HelloWorld/Welcome/3?name=Rick
這次第三個URL 段匹配了路由引數id
. Welcome
方法包含的引數id
匹配於MapRoute方法中的URL模板
. {id?}中結尾的問號表明id引數是可選的。
app.UseMvc(routes =>
{
routes.MapRoute(
name:
"default",
template: "{controller=Home}/{action=Index}/{id?}");
});
在這些例中控制器已經完成了MVC中的VC部分,亦即完成了檢視和控制器。控制器直接返回了HTML,通常你不會想讓控制器直接返回HTML,因為那樣會使程式碼和維護變得很麻煩,作為代替,我們一般使用一個分離的Razor檢視模板來幫助生成HTML響應,我們將在接下來的教程中介紹。