在Web應(yīng)用中,路由是一個(gè)至關(guān)重要的概念,它負(fù)責(zé)將用戶(hù)的請(qǐng)求映射到相應(yīng)的處理程序,以確保正確的頁(yè)面或資源被呈現(xiàn)給用戶(hù)。通過(guò)將用戶(hù)請(qǐng)求與適當(dāng)?shù)奶幚沓绦蜿P(guān)聯(lián)起來(lái),使得應(yīng)用能夠以有序和可維護(hù)的方式響應(yīng)用戶(hù)的操作。
一、ASP.NET Core路由基礎(chǔ)
1.1 路由的定義和作用
-
路由的定義:
路由是Web應(yīng)用中的一個(gè)關(guān)鍵概念,它負(fù)責(zé)將用戶(hù)發(fā)起的HTTP請(qǐng)求映射到相應(yīng)的處理程序,通常是控制器中的動(dòng)作方法。在ASP.NET Core等框架中,路由系統(tǒng)會(huì)根據(jù)請(qǐng)求的URL和路由規(guī)則,確定執(zhí)行哪個(gè)控制器的哪個(gè)動(dòng)作方法來(lái)處理請(qǐng)求。 -
路由的作用:
- 請(qǐng)求映射: 路由的主要作用是將傳入的HTTP請(qǐng)求映射到應(yīng)用程序中的特定處理程序。這使得應(yīng)用程序能夠根據(jù)用戶(hù)請(qǐng)求的不同部分執(zhí)行不同的邏輯。
- URL解析: 路由負(fù)責(zé)解析URL,提取其中的信息以確定請(qǐng)求的性質(zhì)。這可能包括控制器、動(dòng)作方法以及其他參數(shù)。
- RESTful設(shè)計(jì): 在RESTful架構(gòu)中,路由是實(shí)現(xiàn)資源的標(biāo)識(shí)和操作的關(guān)鍵。通過(guò)定義RESTful路由,可以使Web應(yīng)用程序的設(shè)計(jì)更加符合REST原則。
- 參數(shù)傳遞: 路由允許從URL中提取參數(shù),這些參數(shù)可以用于定制請(qǐng)求的處理方式。這包括查詢(xún)字符串參數(shù)、路由值參數(shù)等。
- 友好的URL: 路由設(shè)計(jì)的良好性可以創(chuàng)建友好的URL結(jié)構(gòu),這有助于用戶(hù)理解和記憶URL。清晰的URL也對(duì)搜索引擎優(yōu)化(SEO)有積極影響。
- 路由約束: 路由可以定義各種約束,以確保請(qǐng)求滿(mǎn)足特定的條件。這可以包括正則表達(dá)式、長(zhǎng)度限制、范圍限制等。
- URL生成: 路由不僅僅處理輸入請(qǐng)求,還負(fù)責(zé)生成URL。這使得在應(yīng)用程序中創(chuàng)建鏈接和導(dǎo)航變得簡(jiǎn)單,應(yīng)用程序的其他部分可以通過(guò)路由生成正確的URL。
- 中間件支持: 路由通常與中間件一起工作,以執(zhí)行與請(qǐng)求處理相關(guān)的其他任務(wù),例如身份驗(yàn)證、授權(quán)等。
1.2 路由的主要組件
路由在Web應(yīng)用中由幾個(gè)主要組件構(gòu)成,這些組件協(xié)同工作以確保請(qǐng)求被正確地映射到相應(yīng)的處理程序。以下是路由的主要組件:
- 路由模板(Route Template): 路由模板定義了URL的結(jié)構(gòu)和參數(shù)的位置。它是一個(gè)包含占位符的字符串,這些占位符表示將要從URL中提取的參數(shù)。路由模板通過(guò)一種模式來(lái)匹配傳入請(qǐng)求的URL,從而確定如何映射到相應(yīng)的處理程序。
- 控制器(Controller): 控制器是一個(gè)處理HTTP請(qǐng)求的類(lèi),負(fù)責(zé)處理與用戶(hù)操作相關(guān)的邏輯。在路由中,控制器用于組織和封裝相關(guān)的動(dòng)作方法。每個(gè)控制器都有一個(gè)與之相關(guān)的路由。
- 動(dòng)作方法(Action Method): 動(dòng)作方法是控制器中的方法,用于執(zhí)行特定的操作或響應(yīng)用戶(hù)的請(qǐng)求。路由系統(tǒng)將根據(jù)路由模板和請(qǐng)求的URL確定要執(zhí)行的控制器和動(dòng)作方法。
- 路由表(Route Table): 路由表是一個(gè)數(shù)據(jù)結(jié)構(gòu),它存儲(chǔ)了應(yīng)用程序中所有定義的路由規(guī)則。路由表中包含了每個(gè)路由的路由模板、相關(guān)的控制器和動(dòng)作方法信息。當(dāng)收到一個(gè)請(qǐng)求時(shí),路由系統(tǒng)會(huì)查找路由表以確定如何映射該請(qǐng)求。
- 路由參數(shù)(Route Parameters): 路由參數(shù)是從URL中提取的值,它們填充了路由模板中的占位符。這些參數(shù)在路由系統(tǒng)中被傳遞給相應(yīng)的控制器動(dòng)作方法,以便動(dòng)態(tài)地處理請(qǐng)求。
二、路由模板詳解
2.1 靜態(tài)路由
靜態(tài)路由是一種簡(jiǎn)單直接的路由配置方式,其中路由規(guī)則是固定的,不包含動(dòng)態(tài)參數(shù)。在靜態(tài)路由中,URL的結(jié)構(gòu)和路由模板是固定的,不隨用戶(hù)請(qǐng)求的變化而改變。
-
特點(diǎn):
- 固定路由規(guī)則: 靜態(tài)路由的路由規(guī)則是固定的,不包含占位符或動(dòng)態(tài)參數(shù)。每個(gè)URL都與特定的控制器和動(dòng)作方法相對(duì)應(yīng)。
- 簡(jiǎn)單直觀: 靜態(tài)路由通常比較簡(jiǎn)單,易于理解和配置。它適用于那些不需要?jiǎng)討B(tài)參數(shù)的場(chǎng)景。
-
示例:
考慮一個(gè)使用ASP.NET Core的MVC框架的簡(jiǎn)單靜態(tài)路由示例:
// 靜態(tài)路由配置
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "home",
pattern: "/home",
defaults: new { controller = "Home", action = "Index" }
);
endpoints.MapControllerRoute(
name: "about",
pattern: "/about",
defaults: new { controller = "Home", action = "About" }
);
// 其他靜態(tài)路由規(guī)則...
});
在上述示例中,兩個(gè)靜態(tài)路由規(guī)則分別映射到/home
和/about
路徑,每個(gè)路徑都與指定的控制器(“Home”)和動(dòng)作方法相關(guān)聯(lián)。這意味著當(dāng)用戶(hù)訪(fǎng)問(wèn)/home
時(shí),將執(zhí)行Home
控制器的Index
動(dòng)作方法,而訪(fǎng)問(wèn)/about
時(shí)將執(zhí)行Home
控制器的About
動(dòng)作方法。
Tip:靜態(tài)路由適用于那些不需要考慮動(dòng)態(tài)參數(shù)的場(chǎng)景,例如一些靜態(tài)內(nèi)容的展示頁(yè)面。然而,在很多應(yīng)用中,動(dòng)態(tài)路由更為常見(jiàn),因?yàn)樗梢愿`活地處理各種用戶(hù)請(qǐng)求。
2.2 參數(shù)化路由
參數(shù)化路由是一種更靈活的路由配置方式,允許在路由模板中包含占位符,以捕獲和傳遞動(dòng)態(tài)的參數(shù)。這使得可以處理各種不同形式的URL,并根據(jù)用戶(hù)提供的輸入動(dòng)態(tài)地調(diào)整路由的行為。參數(shù)化路由主要涉及基本參數(shù)、可選參數(shù)和默認(rèn)值三個(gè)方面。
-
基本參數(shù):
基本參數(shù)是路由模板中的占位符,它們表示在特定位置接收用戶(hù)請(qǐng)求中的值。這些參數(shù)將從URL中提取,并傳遞給相應(yīng)的控制器的動(dòng)作方法。
// 基本參數(shù)化路由配置
endpoints.MapControllerRoute(
name: "product",
pattern: "/products/{productId}",
defaults: new { controller = "Product", action = "Details" }
);
在上述示例中,{productId}
是一個(gè)基本參數(shù),表示在/products/
路徑后的任何值都將作為productId
參數(shù)傳遞給Details
動(dòng)作方法。
-
可選參數(shù):
可選參數(shù)是在基本參數(shù)的基礎(chǔ)上加上括號(hào)并使用問(wèn)號(hào)標(biāo)記的形式,表示這個(gè)參數(shù)是可選的。如果用戶(hù)在URL中提供了這個(gè)參數(shù),它將被傳遞給動(dòng)作方法;否則,將使用默認(rèn)值或者為類(lèi)型的默認(rèn)值。
// 可選參數(shù)化路由配置
endpoints.MapControllerRoute(
name: "search",
pattern: "/search/{keyword?}",
defaults: new { controller = "Search", action = "Index", keyword = "" }
);
在上述示例中,{keyword?}
是一個(gè)可選參數(shù),用戶(hù)可以選擇在/search/
路徑后提供一個(gè)關(guān)鍵字,該關(guān)鍵字將傳遞給Index
動(dòng)作方法。如果用戶(hù)未提供關(guān)鍵字,則使用默認(rèn)值""
。
-
默認(rèn)值:
默認(rèn)值是為參數(shù)指定的固定值,當(dāng)用戶(hù)請(qǐng)求中沒(méi)有提供相應(yīng)參數(shù)時(shí),將使用這些默認(rèn)值。默認(rèn)值通常與可選參數(shù)結(jié)合使用。
// 默認(rèn)值參數(shù)化路由配置
endpoints.MapControllerRoute(
name: "category",
pattern: "/category/{categoryId?}",
defaults: new { controller = "Category", action = "Index", categoryId = 1 }
);
在上述示例中,{categoryId?}
是一個(gè)可選參數(shù),并且有一個(gè)默認(rèn)值為1
。如果用戶(hù)未提供categoryId
參數(shù),將使用默認(rèn)值1
,否則將使用用戶(hù)提供的值。
參數(shù)化路由使得應(yīng)用程序能夠更靈活地響應(yīng)各種用戶(hù)請(qǐng)求,并根據(jù)用戶(hù)的輸入動(dòng)態(tài)地調(diào)整路由的行為。這對(duì)于構(gòu)建更動(dòng)態(tài)和可定制的Web應(yīng)用程序是非常有益的。
三、控制器和動(dòng)作方法
3.1 控制器的角色和作用
控制器在MVC(Model-View-Controller)架構(gòu)中扮演著核心角色,負(fù)責(zé)接收用戶(hù)的請(qǐng)求并協(xié)調(diào)相應(yīng)的操作,以便正確呈現(xiàn)視圖或執(zhí)行其他邏輯。以下是控制器的主要角色和作用:
- 請(qǐng)求接收: 控制器負(fù)責(zé)接收來(lái)自用戶(hù)的HTTP請(qǐng)求。請(qǐng)求可以包含用戶(hù)通過(guò)瀏覽器、移動(dòng)應(yīng)用或其他客戶(hù)端發(fā)送的各種信息,如URL參數(shù)、表單數(shù)據(jù)等。
- 協(xié)調(diào)操作: 一旦控制器接收到請(qǐng)求,它將協(xié)調(diào)相應(yīng)的操作,這通常涉及到調(diào)用模型(Model)和/或視圖(View)。控制器作為中介者,將請(qǐng)求傳遞給正確的業(yè)務(wù)邏輯或數(shù)據(jù)處理單元。
- 業(yè)務(wù)邏輯執(zhí)行: 控制器負(fù)責(zé)執(zhí)行業(yè)務(wù)邏輯,這可能包括從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)、更新模型狀態(tài)、調(diào)用其他服務(wù)等。業(yè)務(wù)邏輯的具體實(shí)現(xiàn)可能會(huì)涉及到多個(gè)組件和模塊。
- 模型操作: 控制器通過(guò)調(diào)用模型的方法來(lái)操作和管理應(yīng)用程序的數(shù)據(jù)。它可以對(duì)模型進(jìn)行查詢(xún)、更新、刪除等操作,以確保數(shù)據(jù)的一致性和有效性。
- 視圖選擇: 在MVC架構(gòu)中,控制器通常負(fù)責(zé)選擇合適的視圖進(jìn)行呈現(xiàn)。它決定了用戶(hù)將看到什么內(nèi)容,將請(qǐng)求的結(jié)果傳遞給視圖進(jìn)行展示。
- 響應(yīng)構(gòu)建: 控制器負(fù)責(zé)構(gòu)建HTTP響應(yīng),其中包含將返回給用戶(hù)的數(shù)據(jù)、視圖或其他信息。這可能包括將模型數(shù)據(jù)傳遞給視圖以生成HTML、JSON或其他格式的響應(yīng)。
- 路由處理: 控制器與路由系統(tǒng)協(xié)同工作,確保將請(qǐng)求映射到正確的控制器和動(dòng)作方法。它根據(jù)路由規(guī)則確定應(yīng)該執(zhí)行的操作。
- 狀態(tài)管理: 在處理請(qǐng)求的過(guò)程中,控制器可能需要管理應(yīng)用程序狀態(tài)。這可以包括會(huì)話(huà)管理、身份驗(yàn)證狀態(tài)、臨時(shí)數(shù)據(jù)的存儲(chǔ)等。
3.2 動(dòng)作方法的定義和調(diào)用
動(dòng)作方法是MVC(Model-View-Controller)架構(gòu)中控制器的一部分,負(fù)責(zé)處理特定的用戶(hù)請(qǐng)求并返回相應(yīng)的結(jié)果。以下是動(dòng)作方法的定義和調(diào)用的基本概念:
-
動(dòng)作方法的定義:
- 方法簽名: 動(dòng)作方法是控制器類(lèi)中的公共方法,通常使用公共訪(fǎng)問(wèn)修飾符。它們的方法簽名包括返回類(lèi)型、方法名和可能的參數(shù)。
public class MyController : Controller { public IActionResult MyAction(string parameter1, int parameter2) { // 動(dòng)作方法的實(shí)現(xiàn) return View(); } }
-
返回類(lèi)型: 動(dòng)作方法的返回類(lèi)型通常是
IActionResult
或其派生類(lèi)型。IActionResult
表示動(dòng)作方法的執(zhí)行結(jié)果,可以是視圖、JSON數(shù)據(jù)、重定向等。 - 參數(shù): 動(dòng)作方法可以接受各種參數(shù),這些參數(shù)通常來(lái)自用戶(hù)請(qǐng)求的數(shù)據(jù),如查詢(xún)字符串、路由參數(shù)、表單數(shù)據(jù)等。
-
動(dòng)作方法的調(diào)用:
-
通過(guò)URL觸發(fā): 用戶(hù)請(qǐng)求通過(guò)URL映射到相應(yīng)的控制器和動(dòng)作方法。例如,用戶(hù)訪(fǎng)問(wèn)
/MyController/MyAction
的URL,將觸發(fā)MyController
控制器的MyAction
動(dòng)作方法。 -
通過(guò)HTML表單提交: 如果用戶(hù)通過(guò)HTML表單提交了請(qǐng)求,表單的
action
屬性通常指向相應(yīng)的控制器和動(dòng)作方法。當(dāng)用戶(hù)提交表單時(shí),將觸發(fā)相應(yīng)的動(dòng)作方法。 - 通過(guò)JavaScript或AJAX: 使用JavaScript或AJAX可以在前端異步地觸發(fā)動(dòng)作方法。這通常涉及通過(guò)HTTP請(qǐng)求發(fā)送數(shù)據(jù)到控制器,并處理返回的結(jié)果。
-
通過(guò)路由生成器: 在視圖或其他部分中,可以使用路由生成器(
UrlHelper
)來(lái)生成動(dòng)作方法的URL。這樣可以確保在應(yīng)用程序中正確生成與路由匹配的URL。
-
通過(guò)URL觸發(fā): 用戶(hù)請(qǐng)求通過(guò)URL映射到相應(yīng)的控制器和動(dòng)作方法。例如,用戶(hù)訪(fǎng)問(wèn)
// 在視圖中使用路由生成器生成動(dòng)作方法的URL
<a href="@Url.Action("MyAction", "MyController", new { parameter1 = "value1", parameter2 = 42 })">Link Text</a>
動(dòng)作方法的調(diào)用是由ASP.NET Core框架和路由系統(tǒng)自動(dòng)處理的,無(wú)需手動(dòng)調(diào)用。系統(tǒng)根據(jù)用戶(hù)的請(qǐng)求,將請(qǐng)求映射到相應(yīng)的動(dòng)作方法,并執(zhí)行其邏輯,最后返回相應(yīng)的結(jié)果。
3.3 控制器和動(dòng)作方法的路由映射
四、路由約束
4.1 什么是路由約束
控制器和動(dòng)作方法的路由映射是通過(guò)ASP.NET Core中的路由系統(tǒng)來(lái)實(shí)現(xiàn)的。路由系統(tǒng)負(fù)責(zé)將傳入的HTTP請(qǐng)求映射到相應(yīng)的控制器和動(dòng)作方法,以便執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。以下是控制器和動(dòng)作方法的路由映射的基本概念:
-
控制器級(jí)別的路由映射:
在ASP.NET Core中,可以在控制器類(lèi)上使用[Route]
特性為整個(gè)控制器指定路由模板。這樣,控制器中的所有動(dòng)作方法都將遵循該路由模板。
[Route("api/[controller]")]
public class MyController : Controller
{
// GET: api/My
[HttpGet]
public IActionResult Index()
{
// ...
}
// GET: api/My/Details
[HttpGet("Details")]
public IActionResult Details()
{
// ...
}
}
在上述例子中,MyController
的路由模板是api/[controller]
,其中[controller]
是一個(gè)占位符,會(huì)被替換為控制器的名稱(chēng)。因此,Index
方法的路由是api/My
,而Details
方法的路由是api/My/Details
。
-
動(dòng)作方法級(jí)別的路由映射:
除了在控制器級(jí)別指定路由外,還可以在單個(gè)動(dòng)作方法上使用[Route]
特性指定其路由模板。這樣,該動(dòng)作方法將覆蓋控制器級(jí)別的路由。
public class MyController : Controller
{
// GET: api/Custom
[HttpGet]
[Route("api/Custom")]
public IActionResult CustomAction()
{
// ...
}
}
在上述例子中,CustomAction
方法具有自己的路由模板api/Custom
,與控制器級(jí)別的路由無(wú)關(guān)。
-
路由參數(shù):
動(dòng)作方法可以接受路由參數(shù),這些參數(shù)可以從URL中提取。路由參數(shù)在路由模板中使用花括號(hào){}
包圍。
public class MyController : Controller
{
// GET: api/Products/{id}
[HttpGet("Products/{id}")]
public IActionResult GetProductById(int id)
{
// ...
}
}
在上述例子中,GetProductById
方法接受一個(gè)名為id
的路由參數(shù),該參數(shù)從URL中提取。例如,/api/Products/42
將匹配到這個(gè)方法,并將id
參數(shù)設(shè)置為 42
。
4.2 常見(jiàn)的路由約束類(lèi)型
路由約束用于限制路由參數(shù)的取值范圍,以確保只有符合特定條件的參數(shù)值才能匹配到相應(yīng)的路由規(guī)則。在ASP.NET Core中,常見(jiàn)的路由約束類(lèi)型包括正則表達(dá)式約束、長(zhǎng)度約束和范圍約束。
- 正則表達(dá)式約束:
正則表達(dá)式約束允許使用正則表達(dá)式來(lái)指定路由參數(shù)的格式,只有滿(mǎn)足正則表達(dá)式條件的參數(shù)值才會(huì)匹配到路由。
public class MyController : Controller
{
// 匹配數(shù)字格式的id,例如:/api/Products/123
[HttpGet("Products/{id:regex(^\\d+$)}")]
public IActionResult GetProductById(int id)
{
// ...
}
}
在上述例子中,id:regex(^\\d+$)
表示id
參數(shù)必須是數(shù)字格式,正則表達(dá)式^\\d+$
匹配一個(gè)或多個(gè)數(shù)字。
- 長(zhǎng)度約束:
長(zhǎng)度約束用于指定路由參數(shù)的長(zhǎng)度范圍,可以限制參數(shù)的最小長(zhǎng)度、最大長(zhǎng)度或者同時(shí)限制兩者。
public class MyController : Controller
{
// 限制name參數(shù)的長(zhǎng)度在3到50之間
[HttpGet("Users/{name:length(3,50)}")]
public IActionResult GetUserByName(string name)
{
// ...
}
}
在上述例子中,name:length(3,50)
表示name
參數(shù)的長(zhǎng)度必須在3到50之間。
- 范圍約束:
范圍約束用于限制路由參數(shù)的取值范圍,可以限制參數(shù)的最小值、最大值或者同時(shí)限制兩者。
public class MyController : Controller
{
// 限制age參數(shù)的值在18到99之間
[HttpGet("Users/{age:range(18,99)}")]
public IActionResult GetUserByAge(int age)
{
// ...
}
}
在上述例子中,age:range(18,99)
表示age
參數(shù)的值必須在18到99之間。
通過(guò)使用這些路由約束,可以增強(qiáng)路由的靈活性和安全性,確保只有符合指定條件的參數(shù)值才會(huì)匹配到相應(yīng)的路由規(guī)則。這有助于有效地過(guò)濾和驗(yàn)證用戶(hù)輸入。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-804333.html
五、總結(jié)
今天我詳細(xì)解釋了ASP.NET Core中路由的基本概念,包括靜態(tài)路由、參數(shù)化路由的基本參數(shù)、可選參數(shù)、默認(rèn)值,以及控制器和動(dòng)作方法的定義與調(diào)用。此外,我介紹了控制器和動(dòng)作方法的路由映射,包括控制器級(jí)別和動(dòng)作方法級(jí)別的路由設(shè)置,以及常見(jiàn)的路由約束類(lèi)型,如正則表達(dá)式、長(zhǎng)度和范圍約束。這些內(nèi)容有助于構(gòu)建靈活、可維護(hù)的ASP.NET Core應(yīng)用程序。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-804333.html
到了這里,關(guān)于【ASP.NET Core 基礎(chǔ)知識(shí)】--路由和請(qǐng)求處理--路由概念(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!