1. 程式人生 > >【asp.net core 系列】2 控制器與路由的恩怨情仇

【asp.net core 系列】2 控制器與路由的恩怨情仇

0. 前言

在上一篇文章中,我們初步介紹了asp.net core,以及如何建立一個mvc專案。從這一篇開始,我將為大家展示asp.net core 的各種內容,並且嘗試帶領大家來挖掘其中的內在邏輯。

當然,那是以後的事情。這一篇將通過自定義一個控制器來為大家介紹asp.net core mvc 中控制器和路由的相關知識。

1. 控制器

先在Controllers目錄下新增一個類,名叫:

public class DemoController
{
    public string Index()
    {
        return "你好";
    }
}

訪問地址:

http://localhost:5006/demo/index

如果不出意外的話,你應該能看到網頁上的**"你好"**兩個字。

再新建一個類:

using Microsoft.AspNetCore.Mvc;
public class NoContrl : Controller
{
    public IActionResult Index()
    {
        return Content("Test");
    }
}

結合兩個不常規的控制器類,讓我們初窺asp.net core MVC是如何識別控制器的。這正是我之前說的,約定優於配置最好的體現。這個哲學最早也是為MVC提出來的,後來被.net framework引申到各個方面。

asp.net core mvc識別控制器,會在專案中發現 以Controller結尾的公開類或者繼承自Controller的公開類,並將這些類標記為控制器。當接到使用者或者介面轉交的請求時,程式從請求路徑中解析出控制器名稱,然後尋找 <控制器>Controller 或者 <控制器> : Controller 的類。

在預設情況下,一個訪問URL會在程式中解析成如下格式:

http://<HOST>:<PORT>/<Controller>/<Action>[其他引數]

在上文中,我們知道了控制器的解析規則,那麼現在看一下Action的解析規則:

在DemoController中新增如下方法:

public int TestInt()
{
    return 10;
}

public object TestObject()
{
    return new
    {
        Name = "TestObject",
        Age = 1
    };
}

public string TestPublic()
{
    return "成功訪問 TestPublic";
}

    protected string TestProtect()
{
    return "成功訪問 TestProtect";
}

private string TestPrivate()
{
    return "成功訪問 TestPrivate";
}

重新啟動,後依次訪問如下地址:

http://localhost:5006/Demo/TestInt
http://localhost:5006/Demo/TestObject
http://localhost:5006/Demo/TestPublic
http://localhost:5006/Demo/TestProtect
http://localhost:5006/Demo/TestPrivate

然後可以看到,TestInt、TestObject以及TestPublic均能正常訪問,但TestProtect和TestPrivate都提示找不到網頁或無法訪問。

可以看到,對於程式而言,Action就是控制器類裡的公開類方法,與方法的返回值無關。也就是說,程式會找到 XXXController 或者名為XXX但繼承了Controller的類作為XXX的控制器,然後繼續在這個類裡尋找到Action,如果沒有找到就會返回404的請求。

2. 路由

在第一節中,我們介紹了一下asp.net core mvc如何尋找控制器和Action,那這一節將介紹程式如何從請求連結中解析出控制器和Action的名稱,也就是路由對映。

路由(Routing)負責匹配傳入的HTTP請求,然後將這些請求傳送給應用的可執行終結點。終結點是應用的可執行請求處理程式碼單元,也就是我們控制器裡的方法(Action)。

2.1 路由的配置

對於所有的asp.net core模板都包括生成在程式碼中的路由。通常,我們要求路由在Startup.Configure方法中進行配置。

注意,Startup類裡有且只有一個Configure方法,不能出現其過載版本。

該方法的宣告一般情況如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env);

如果想要設定路由,需要先註明專案啟用路由:

app.UseRouting();

然後使用如下方法配置路由:

app.UseEndpoints(endpoints =>
{
    // 配置路由
});

通常對於mvc專案而言,我們一般使用如下方式配置路由:

endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

這行程式碼的意思是:建立一個名字為 default 的對映控制器的路由,對映規則為 //{id?},也就是第一個為控制器,第二個為Action,第三個是ID,其中ID可以不存在,當Action無法從請求地址中解析出來時預設為Index,控制器預設為Home。

通過這個解析,我們可以得知 我們之前訪問的

http://localhost:5000/

是哪個控制器裡的什麼方法來處理了——HomeController.Index。

那麼我們修改一下HomeController.Index來驗證一下,我們理解是否有誤:

public IActionResult Index()
{
    return View();
}
//  修改為
public IActionResult Index()
{
    return Content("測試");
}

重新執行程式,訪問

http://localhost:5000/

然後看到頁面出現:測試字樣,可以看到路由系統自動為我們補全了控制器名和action名。如果方法中出現引數,則自動按照引數名1=值1&引數名2=值2這種形式檢視引數。Id為特殊的,會自動按照目錄其對映。所以:

http://localhost:5000/控制器1/方法1/id值
http://localhost:5000/控制器1/方法1?id=id值

是一個請求連結。

2.2 新增路由配置

那麼,我們回過頭來看一下宣告路由的方法:

public static ControllerActionEndpointConventionBuilder MapControllerRoute(this IEndpointRouteBuilder endpoints, string name, string pattern, object defaults = null, object constraints = null, object dataTokens = null);

預設情況下,我們不會設定 defaults、constraints、dataTokens,這三個引數都有含義,這裡不對後兩個做介紹,簡單介紹一下第一個:

在路由配置的方法裡,新增以下內容:

endpoints.MapControllerRoute(
                    name : "test",
                    pattern: "DemoTest/{action=Index}/{id?}",
                    defaults : new 
                    {
                        Controller = "Demo",

                    });

至此,我們沒有建立名為DemoTest的控制器,但是我們在訪問:

http://localhost:5006/DemoTest

仍然能得到響應,而且控制器被解析為Demo。

這就是defaults的意義,路由在解析的時候,系統會把defaults中的值自動填充到路由連線中沒有設定的值裡。

當我們設定多個路由的時候,路由系統會優先嚐試匹配最容易解析的配置。比如說,當我們訪問:

http://localhost:5000/DemoTest/

的時候,路由系統會優先從名為test的配置表中解析,只有當無法從這裡找到時才會從其他路由中解析。

3. 總結

這一篇我們簡單介紹了控制器與路由對映,可以訪問我們自己新增的路由。在開發中,通常情況下,建立的控制器都是以Controller結尾並繼承Controller類。這是因為Controller類有很多有用的屬性和方法供我們使用,以Controller結尾是為了統一規則,可以讓我們一眼看出哪些是控制器。

更多內容煩請關注我的部落格《高先生小屋》

相關推薦

asp.net core 系列2 控制器路由恩怨情仇

0. 前言 在上一篇文章中,我們初步介紹了asp.net core,以及如何建立一個mvc專案。從這一篇開始,我將為大家展示asp.net core 的各種內容,並且嘗試帶領大家來挖掘其中的內在邏輯。 當然,那是以後的事情。這一篇將通過自定義一個控制器來為大家介紹asp.net core mvc 中控制器和路

asp.net core 系列3 檢視以及檢視控制器

# 0.前言 在之前的幾篇中,我們大概介紹瞭如何建立一個asp.net core mvc專案以及http請求如何被路由轉交給對應的執行單元。這一篇我們將介紹一下控制器與檢視直接的關係。 # 1. 檢視 這裡的檢視不是資料庫裡的檢視,是一種展示技術。在asp.net core mvc專案中檢視是指以csh

asp.net core 系列 1 帶你瞭解一下asp.net core

# 0. 前言 這是一個新的系列,名字是《ASP.NET Core 入門到實戰》。這個系列主講ASP.NET Core MVC,輔助一些前端的基礎知識(能用來實現我們需要的即可,並非主講)。同時這個系列也會在後續介紹ASP.NET Core 平臺的其它型別的專案,並帶領大家以各個型別的專案為主要架構開發一個

asp.net core 系列4. 更高更強的路由

# 0. 前言 在之前我們介紹了請求通過路由尋找到控制器,以及控制器與檢視的資料流轉。那麼,我們回過頭來,再看看路由的一些其他用法。 # 1. 路由屬性(Route Attribute) 按照英文的直接翻譯,Routing Attribute 的意思是路由屬性,但實際上 Attribute在微軟的官方稱

asp.net core 系列5 佈局頁和靜態資源

# 0. 前言 在之前的4篇的內容裡,我們較為詳細的介紹了路由以及控制器還有檢視之間的關係。也就是說,系統如何從使用者的HTTP請求解析到控制器裡,然後在控制器裡處理資料,並返回給檢視,在檢視中顯示出來。這一篇我將為大家介紹基礎的最後一部分,佈局頁和靜態資源引入。 # 1. 佈局頁 在控制器和檢視那一篇

asp.net core 系列6 實戰之 一個專案的完整結構

# 0. 前言 在《asp.net core 系列》之前的幾篇文章中,我們簡單瞭解了路由、控制器以及檢視的關係以及靜態資源的引入,讓我們對於asp.net core mvc專案有了基本的認識。不過,這些並不是 asp.net core mvc專案的全部內容,剩下的內容我將結合實戰專案為大家講解其中的知識。現

asp.net core 系列8 實戰之 利用 EF Core 完成資料操作層的實現

# 0. 前言 通過前兩篇,我們建立了一個專案,並規定了一個基本的資料層訪問介面。這一篇,我們將以EF Core為例演示一下資料層訪問介面如何實現,以及實現中需要注意的地方。 # 1. 新增EF Core 先在資料層實現層引入 EF Core: ```bash cd Domain.Implements

asp.net core 系列10 實戰之ActionFilter

# 0.前言 在上一篇中,我們提到了如何建立一個UnitOfWork並通過ActionFilter設定啟用。這一篇我們將簡單介紹一下ActionFilter以及如何利用ActionFilter,順便補齊一下上一篇的工具類。 # 1. ActionFilter 介紹 ActionFilter全稱是Act

asp.net core 系列12 資料加密演算法

# 0. 前言 這一篇我們將介紹一下.net core 的加密和解密。在Web應用程式中,使用者的密碼會使用MD5值作為密碼資料儲存起來。而在其他的情況下,也會使用加密和解密的功能。 常見的加密演算法分為對稱加密和非對稱加密。所謂的對稱加密是指加密金鑰和解密金鑰是同一個,非對稱加密是值加密金鑰和解密迷藥不

asp.net core 系列13 Identity 身份驗證入門

# 0. 前言 通過前兩篇我們實現瞭如何在Service層如何訪問資料,以及如何運用簡單的加密演算法對資料加密。這一篇我們將探索如何實現asp.net core的身份驗證。 # 1. 身份驗證 asp.net core的身份驗證有 JwtBearer和Cookie兩種常見的模式,在這一篇我們將啟用Coo

asp.net core 系列14 .net core 中的IOC

# 0.前言 通過前面幾篇,我們瞭解到瞭如何實現專案的基本架構:資料來源、路由設定、加密以及身份驗證。那麼在實現的時候,我們還會遇到這樣的一個問題:當我們業務類和資料來源越來越多的時候,我們無法通過普通的構造物件的方法為每個例項進行賦值。同時,傳統意義上的賦值遇到底層切換或者其他修改的時候,就需要修改大量的

asp.net core 系列15 自定義Identity

# 0. 前言 在之前的文章中簡單介紹了一下asp.net core中的Identity,這篇文章將繼續針對Identity進行進一步的展開。 # 1. 給Identity新增額外的資訊 在《【asp.net core 系列】13 Identity 身份驗證入門》一文中,我們大概瞭解瞭如何使用Ident

ASP.NET MVC系列淺談MVC

後端 nbsp 文獻 ats 路勁 onf 將在 cot get 描述 本篇文章主要概述ASP.NET MVC,具體包括如下內容: 1.MVC模式概述 2.WebForm概述 3.WebForm與MVC區別 4.ASP.NET MVC發展歷程 5.運用程序結構 6.ASP.

ASP.NET MVC系列淺談表單和HTML輔助方法

繼承 好的 內容 概述 調用 復制 畫圖 models pac 【01】淺談Google Chrome瀏覽器(理論篇) 【02】淺談Google Chrome瀏覽器(操作篇)(上) 【03】淺談Google Chrome瀏覽器(操作篇)(下) 【04】淺談AS

ASP.NET Core學習Razor頁面

 這裡介紹了Razor基本用法 建立帶PageModel的Razor 頁面 使用資料庫 展示資料 更新資料 篩選器 準備工作 初始化空的專案(終端輸入:dotnet new web -n=Razor) Nuget新增Microsoft.EntityFrameworkC

ASP.NET Core學習Entity Framework Core

 這裡介紹在ASP.NET Core中使用EF Core,這裡資料庫選的是Sql Server 如何使用Sql Server 新增模型 && 資料庫遷移 查詢資料 儲存資料 如何使用Sql Server  1. 安裝dotnet-ef(已經安裝忽略)

ASP.NET Core學習Web API

 這裡介紹在ASP.NET Core中使用Web API建立 RESTful 服務,本文使用VSCode + NET Core3.0 建立簡單Rest API 格式化輸出 JSON Patch請求 Open API(Swagger)整合 建立簡單Rest API 在終端輸

ASP.NET Core學習遠端過程呼叫 - gRPC使用

 本文介紹在gRPC使用,將從下面幾個方面介紹 什麼是RPC 什麼時候需要RPC 如何使用gRPC 什麼是RPC RPC是Remote Procedure Call簡稱,翻譯過來是遠端過程呼叫。它是一個程序間的通訊技術,基於Client-Server模式,讓程式像呼叫本地方

ASP.NET Core學習使用JWT認證授權

# 概述 --- 認證授權是很多系統的基本功能 , 在以前PC的時代 , 通常是基於cookies-session這樣的方式實現認證授權 , 在那個時候通常系統的使用者量都不會很大, 所以這種方式也一直很好執行, 隨著現在都軟體使用者量越來越大, 系統架構也從以前垂直擴充套件(增加伺服器效能) -> 水平擴充

ASP.NET CORE系列基於Claim登錄授權

amp account 技術 time 其他 cookie first arp 好的 介紹 關於什麽是Claim? 可以看看其他大神的文章: http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-base