第二章指南(4.2)添加 Controller
原文:Adding a controller
翻譯:婁宇(Lyrics)
校對(duì):劉怡(AlexLEWIS)、何鎮(zhèn)汐、夏申斌、孟帥洋(書(shū)緣)
Model-View-Controller (MVC) 架構(gòu)模式將一個(gè)應(yīng)用程序分離成三個(gè)主要的組件:?Model、View 以及Controller 。 MVC 模式幫助你創(chuàng)建可測(cè)試的應(yīng)用程序,比傳統(tǒng)的單塊應(yīng)用程序更加容易維護(hù)和更新。基于 MVC 的應(yīng)用程序包含:
Models:應(yīng)用程序中用來(lái)表示數(shù)據(jù)的類,并使用驗(yàn)證邏輯來(lái)執(zhí)行該數(shù)據(jù)業(yè)務(wù)規(guī)則。通常,模型(Model)對(duì)象從數(shù)據(jù)庫(kù)查詢和存儲(chǔ) Model 狀態(tài)。在本教程?Movie?模型(Model)從數(shù)據(jù)庫(kù)查詢電影數(shù)據(jù)用來(lái)顯示或更新。更新后的數(shù)據(jù)寫(xiě)入 SQL Server 數(shù)據(jù)庫(kù)。
Views:視圖是顯示用戶界面(UI)的組件。通常,UI 用于顯示模型(Model)數(shù)據(jù)。
Controllers:一種類(Class),用于處理瀏覽器請(qǐng)求,查詢模型(Model)數(shù)據(jù),以及將指定視圖模板作為響應(yīng)返回給瀏覽器。在 MVC 應(yīng)用程序中,視圖(View)僅僅顯示信息; 控制器(Controller)處理和響應(yīng)用戶的輸入和交互。例如, 控制器(Controller)處理路由數(shù)據(jù)和查詢字符串值,然后將這些值傳遞給模型(Model),模型(Model)可以使用這些值去查詢數(shù)據(jù)庫(kù)。
MVC 模式幫助你創(chuàng)建一個(gè)分離不同方面的應(yīng)用程序(輸入邏輯,業(yè)務(wù)邏輯,以及 UI 邏輯),同時(shí)這些元素之間是松耦合的。該模式指定在應(yīng)用程序中的每一種邏輯應(yīng)該位于何處。 UI 邏輯屬于視圖(View)。輸入邏輯屬于控制器(Controller)。業(yè)務(wù)邏輯屬于模型(Model)。當(dāng)你構(gòu)建一個(gè)應(yīng)用程序時(shí),這樣的分離幫助你管理應(yīng)用程序的復(fù)雜性,因?yàn)樗鼓憔帉?xiě)一個(gè)方面的代碼時(shí)不會(huì)影響其他(方面)的代碼。比如,你可以編寫(xiě)視圖(View)代碼而不需要依賴于業(yè)務(wù)邏輯代碼。
我們會(huì)在本系列教程中涵蓋所有這些概念,并告訴你如何使用它們構(gòu)建一個(gè)簡(jiǎn)單的電影應(yīng)用程序。下面的圖片展示了 MVC 項(xiàng)目中的?Models?、?Views?以及?Controllers?文件夾。
在?解決方案資源管理器(Solution Explorer)?中,鼠標(biāo)右鍵點(diǎn)擊?Controllers > 添加(Add) > 控制器(Controller)
在?添加基架(Add Scaffold)?對(duì)話框中
點(diǎn)擊?MVC Controller - Empty
點(diǎn)擊?添加(Add)
命名控制器(Controller)為?HelloWorldController
點(diǎn)擊?添加(Add)
用下面的代碼替換?Controllers/HelloWorldController.cs?中的內(nèi)容:
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...";}} }
控制器(Controller)的每個(gè)?public?方法都可作為 HTTP 端點(diǎn)。在上面的例子中,兩個(gè)方法都返回 string,注意它們的注釋:
public class HelloWorldController : Controller{ ? ?// // GET: /HelloWorld/ ?(手動(dòng)高亮)public string Index() ? ?{ ? ? ? ?return "This is my default action...";} ? ?// // GET: /HelloWorld/Welcome/ ?(手動(dòng)高亮)public string Welcome() ? ?{ ? ? ? ?return "This is the Welcome action method...";} }第一條注釋指出這是一個(gè)通過(guò)在 URL 后添加 "/HelloWorld/" 調(diào)用的?HTTP GET?方法。第二條指出這是一個(gè)通過(guò)在 URL 后添加 "/HelloWorld/Welcome/" 調(diào)用的?HTTP GET?方法。之后的教程我們將使用基架引擎來(lái)生成?HTTP POST?方法。
使用非調(diào)試模式(Ctrl+F5)運(yùn)行應(yīng)用程序,并在瀏覽器地址欄路徑后添加 "HelloWorld" (在下面的圖片中,使用了?http://localhost:1234/HelloWorld?,但是你必須用你的應(yīng)用程序端口替換?1234?)。?Index 方法返回一段字符串,系統(tǒng)將這段字符串轉(zhuǎn)換為 HTML 返回給瀏覽器。
MVC 調(diào)用的控制器(Controller)類 (以及它們的 Action 方法) 取決于傳入的 URL 。MVC 的默認(rèn)路由邏輯采用類似下面規(guī)則格式來(lái)決定代碼的調(diào)用:
/[Controller]/[ActionName]/[Parameters]
你可以在?Startup.cs?文件中設(shè)置路由規(guī)則。
app.UseMvc(routes => {routes.MapRoute( ? ? ? ?name: "default", ? ? ?? ? ? ?template: "{controller=Home}/{action=Index}/{id?}"); ?
//(手動(dòng)高亮)});
當(dāng)你運(yùn)行應(yīng)用程序且不提供任何 URL 段時(shí),它將默認(rèn)訪問(wèn)在上面模板中高亮行指定的 "Home" Controller 中的 "Index" Action 方法。
第一個(gè) URL 段決定運(yùn)行哪個(gè)控制器(Controller)。所以?localhost:xxxx/HelloWorld?映射到?HelloWorldController?類。URL 段的第二部分決定類里的 Action 方法。所以?localhost:xxxx/HelloWorld/Index?將運(yùn)行?HelloWorldController?中的?Index?方法。請(qǐng)注意,我們只需要瀏覽?localhost:xxxx/HelloWorld,默認(rèn)會(huì)調(diào)用?Index?方法。這是因?yàn)樵跊](méi)有指定方法名時(shí),?Index是默認(rèn)方法。URL 段的第三部分 (?Parameters) 是路由數(shù)據(jù)。我們之后將在本教程中了解路由數(shù)據(jù)。
瀏覽?http://localhost:xxxx/HelloWorld/Welcome?。?Welcome?方法運(yùn)行并返回 "This is the Welcome action method..." 。默認(rèn)的 MVC 路由是?/[Controller]/[ActionName]/[Parameters]?。對(duì)于這個(gè) URL , 控制器(Controller)是?HelloWorld?, Action 方法是?Welcome?。我們還沒(méi)有使用 URL 中的?[Parameters]?部分。
讓我們稍微修改一下例子,使我們能夠通過(guò) URL 傳遞一些參數(shù)信息到控制器(Controller)(例如,?/HelloWorld/Welcome?name=Scott&numtimes=4?)。如下所示修改?Welcome?方法使其包含兩個(gè)參數(shù)。請(qǐng)注意,代碼利用 C# 的可選參數(shù)特性指明,在沒(méi)有傳遞參數(shù)的情況下,?numTimes?參數(shù)默認(rèn)為1。
public string Welcome(string name, int numTimes = 1){ ??return HtmlEncoder.Default.Encode( ? ? ? ?"Hello " + name + ", NumTimes is: " + numTimes); }
警告
上面的代碼使用?HtmlEncoder.Default.Encode?來(lái)保護(hù)應(yīng)用程序免受惡意輸入(即 JavaScript)。
警告
在 Visual Studio 2015 中,當(dāng)你以非調(diào)試模式 (Ctl+F5) 運(yùn)行,你不需要在修改代碼后生成應(yīng)用程序。只需要保存文件,刷新你的瀏覽器就可以看到改變。
運(yùn)行你的應(yīng)用程序并瀏覽:
http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4
(用你的端口替換 xxxx。) 你可以在 URL 中對(duì)?name?和?numtimes?嘗試不同的值。 模型綁定系統(tǒng)自動(dòng)將地址欄里查詢字符串中有名字的參數(shù)映射到你方法中的參數(shù)。查看 :doc:/mvc/models/model-binding?獲得更多的信息。
在上面的示例中, URL 段 (Parameters) 沒(méi)有被使用,?name?和?numTimes?參數(shù)作為?查詢字符串?被傳遞。 上面 URL 中的???(問(wèn)號(hào)) 是一個(gè)分隔符,后面跟查詢字符串。?&?字符分割查詢字符串。
用下面的代碼替換?Welcome?方法:
public string Welcome(string name, int ID = 1){ ? ?return HtmlEncoder.Default.Encode( ? ? ? ?"Hello " + name + ", ID: " + ID); }運(yùn)行應(yīng)用程序然后輸入 URL :?http://localhost:xxx/HelloWorld/Welcome/3?name=Rick
這次第三個(gè) URL 段匹配上路由參數(shù)?id?。?Welcome?方法包含一個(gè)與?MapRoute?內(nèi)的 URL 模板相匹配的?id?參數(shù)。跟隨的???(id?) 表示?id?參數(shù)是可選的。
app.UseMvc(routes => {routes.MapRoute( ? ? ? ?name: "default", ? ? ? ?template: "{controller=Home}/{action=Index}/{id?}"); ?//(手動(dòng)高亮)});在這些例子中,控制器(Controller)一直在做 MVC 中的 "VC" 部分,就是視圖(View)和控制器(Controller)部分的工作。這個(gè)控制器(Controller)直接返回 HTML 。一般來(lái)說(shuō)你不想讓控制器(Controller) 直接返回 HTML ,因?yàn)檫@讓編碼和維護(hù)變得非常麻煩。所以,我們通常會(huì)使用一個(gè)單獨(dú)的 Razor 視圖模板文件來(lái)幫助生成 HTML 響應(yīng)。 我們將在下一個(gè)教程中介紹這部分。
由于水平有限,錯(cuò)漏之處在所難免,歡迎大家批評(píng)指正,不勝感激,我們將及時(shí)修正。
dotNet Core Studying Group:436035237
相關(guān)文章:
ASP.NET Core 1.0 入門(mén)——了解一個(gè)空項(xiàng)目
ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)
.NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0簡(jiǎn)介
云服務(wù)器下ASP.NET Core 1.0環(huán)境搭建(包含mono與coreclr)
使用VS Code開(kāi)發(fā)ASP.NET Core 應(yīng)用程序
dotnet run是如何啟動(dòng)asp.net core站點(diǎn)的
ASP.NET Core提供模塊化Middleware組件
“dotnet restore"和"dotnet run"都做了些什么?
探秘 dotnet run 如何運(yùn)行 .NET Core 應(yīng)用程序
.NET Portability Analyzer 已開(kāi)源
ASP.NET Core的配置(1):讀取配置信息
ASP.NET Core的配置(2):配置模型詳解
.NET Core 1.0 RC2 歷險(xiǎn)之旅
使用VS Code開(kāi)發(fā) 調(diào)試.NET Core 應(yīng)用程序
讓我們Core在一起:ASP.NET Core & .NET Core
.NET Core VS Code 環(huán)境配置
官方博客明確了 .NET Core RC2/RTM 時(shí)間表
.NET Core全新的配置管理[共9篇]
利用記事本創(chuàng)建一個(gè)ASP.NET Core RC2 MVC應(yīng)用
微軟.NET 正式劈腿成功,橫跨所有平臺(tái)
.NET Core 1.0 CentOS7 嘗試
解讀發(fā)布:.NET Core RC2 and .NET Core SDK Preview 1
[.NET Core].NET Core R2安裝及示例教程
ASP.NET Core 開(kāi)發(fā)-中間件(Middleware)
結(jié)合Jexus + Kestrel 部署 asp.net core 生產(chǎn)環(huán)境
通過(guò)Jexus 部署 dotnetcore版本MusicStore 示例程序
ASP.NET Core 中文文檔 第一章 入門(mén)
用 Visual Studio Code 在 macOS 上創(chuàng)建首個(gè) ASP.NET Core 應(yīng)用程序
用 Visual Studio 和 ASP.NET Core MVC 創(chuàng)建首個(gè) Web API
用 Visual Studio 發(fā)布一個(gè) Azure 云 Web 應(yīng)用程序
ASP.NET Core MVC 與 Visual Studio 入門(mén)
原文地址:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-2_4_2-adding-controller.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
贊賞
人贊賞
總結(jié)
以上是生活随笔為你收集整理的第二章指南(4.2)添加 Controller的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 厚积薄发,拥抱 .NET 2016
- 下一篇: DotNet Core 介绍