網(wǎng)站首頁 編程語言 正文
相關(guān)文章
ASP.NET Core中MVC模式實(shí)現(xiàn)路由一
ASP.NET Core中MVC模式實(shí)現(xiàn)路由二
1.URL生成
MVC應(yīng)用程序可以使用路由的URL生成功能,生成指向操作(Action)的URL鏈接。 IUrlHelper 接口用于生成URL,是MVC與路由之間的基礎(chǔ)部分。在控制器、視圖和視圖組件中,可通過Url屬性找到IUrlHelper的實(shí)例。在此示例中,將通過Controller.Url屬性使用IUrlHelper接口來生成指向另一項(xiàng)操作的URL。
public class HomeController : Controller { public IActionResult Index() { var url1= Url.Action("Privacy");//Url:Home/Privacy var url2 = Url.Action("Error");//Url:Home/Error var url3 = Url.Action("Article");//Url:Blog/Article var msg = $"url1: {url1}"; msg += $"\r\nurl2: {url2}"; msg += $"\r\nurl3: {url3}"; return Content(msg); } [HttpGet("custom/url/to/privacy")]//定義一個(gè)路由模版 public IActionResult Privacy() { return View(); } public IActionResult Error(string code) { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } }
響應(yīng)結(jié)果:
如果Url.Action方法都只設(shè)置Action名稱,那么IUrlHelper接口會(huì)獲取通過指向當(dāng)前所在控制器里存在的Action操作,然后生成URL。如果當(dāng)前控制器里Action操作自定義路由模版,則會(huì)生成對應(yīng)路由模版URL。如果Action不存在當(dāng)前控制器里,則會(huì)生成空字符串的URL。
2.URL生成方式
2.1根據(jù)操作名稱生成URL
Url.Action (IUrlHelper. Action) 可以通過指定控制器(Controller)名稱和操作(Action)名稱來生成要鏈接的內(nèi)容。而重載方法里還包含添加路由值對象,比如Url.Action("Home", "Index", new { id = 17 }),此處路由值對象就是new { id = 17 }(路由值對象通常是匿名類型的對象)。下面我們通過示例來看看:
public class HomeController : Controller { public IActionResult Index(int id) { var url = Url.Action("Index", "Home", new { id = 17, color = "red", sex = "m" }); return View(); } }
通過DEBUG查看生成URL:
2.2根據(jù)路由生成URL
上面的代碼演示了如何通過傳入控制器和操作名稱來生成URL。IUrlHelper還提供 Url.RouteUrl系列的方法。這些方法類似于Url.Action,但它們不會(huì)將action和controller的當(dāng)前值復(fù)制到路由值。最常見的用法是指定一個(gè)路由名稱,以使用特定路由來生成URL,通常不指定控制器或操作名稱。
public class HomeController : Controller { public IActionResult Index(int id) { var url = Url.RouteUrl("Privacy_Name"); return View(); } [HttpGet("custom/url/to/privacy",Name = "Privacy_Name")]//定義一個(gè)路由模版 public IActionResult Privacy() { return View(); } }
通過DEBUG查看生成URL:
2.3在HTML中生成URL
IHtmlHelper提供HtmlHelper方法Html.BeginForm和Html.ActionLink,可分別生成
@using (Html.BeginForm("Article", "Blog", FormMethod.Get, new { name = "nForm", id = "idForm" })){} @Html.ActionLink("Article", "Article", "Blog")
通過瀏覽器工具查看生成HTML:
2.4在操作結(jié)果中生成URL
以上示例展示了如何在控制器中使用IUrlHelper。不過,控制器中最常見的用法是將URL生成為操作結(jié)果的一部分。ControllerBase和Controller基類為操作結(jié)果提供簡便的方法來引用另一項(xiàng)操作。一種典型用法是在接受用戶輸入后進(jìn)行重定向。
public IActionResult Edit(int id, Customer customer) { if (ModelState.IsValid) { // Update DB with new details. return RedirectToAction("Index"); } return View(customer); }
3.區(qū)域(Area)
區(qū)域是ASP.NET功能,它提供了一種將ASP.NET Core Web應(yīng)用程序劃分為更小的功能組的方法,每個(gè)功能組都有自己的一組Razor Pages、控制器(Controllers)、視圖(Views)和模型(Models)。區(qū)域?qū)嶋H上是應(yīng)用程序內(nèi)的結(jié)構(gòu)。在ASP.NET Core Web項(xiàng)目中,Pages、模型、控制器和視圖等邏輯組件保存在不同的文件夾中。ASP.NET Core運(yùn)行時(shí)使用命名約定來創(chuàng)建這些組件之間的關(guān)系。對于大型應(yīng)用程序,將應(yīng)用程序區(qū)分為獨(dú)立的高級功能區(qū)域可能更有利。例如,具有多個(gè)業(yè)務(wù)單位(如結(jié)賬、計(jì)費(fèi)、搜索等)的電子商務(wù)應(yīng)用程序。每個(gè)單位都有自己的區(qū)域,以包含視圖、控制器、Razor Pages和模型。下面的示例我們根據(jù)采購(Purchase)和銷售(Sale)訂單兩個(gè)業(yè)務(wù)場景在MVC中配置使用默認(rèn)傳統(tǒng)路由和區(qū)域路由:
public class Startup { public void Configure(IApplicationBuilder app) { app.UseMvc(routes => { routes.MapAreaRoute( name: "MyAreaPurchase", areaName: "Purchase", template: "Purchase/{controller}/{action}/{id?}"); routes.MapAreaRoute( name: "MyAreaSale", areaName: "Sale", template: "Sale/{controller}/{action}/{id?}"); routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); //等價(jià)于 //routes.MapAreaRoute("purOrder_route", "Purchase", //"Purchase/{controller}/{action}/{id?}"); //routes.MapAreaRoute("saleOrder_route", "Sale", //"Sale/{controller}/{action}/{id?}"); //routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}"); }); } }
在上面的示例中,路由值將與以下操作匹配:
[Area("Purchase")] public class PurOrderController : Controller { public IActionResult Index() { return View(); } } [Area("Sale")] public class SaleOrderController : Controller { public IActionResult Index() { return View(); } }
在每個(gè)控制器加入AreaAttribute屬性是表示該控制器是某個(gè)區(qū)域的一部分,比方說,PurOrderController控制器位于Purchase區(qū)域中,SaleOrderController控制器位于Sale區(qū)域中。 而沒有 [Area] 屬性的控制器不是任何區(qū)域的成員,在路由提供area路由值時(shí)不匹配時(shí),打開對應(yīng)控制器下的視圖時(shí)將無法打開。在上面的示例中,只有所列出PurOrderController、SaleOrderController控制器下視圖Index的路由值 { area = Purchase, controller = PurOrder, action = Index } 、{ area = Sale, controller = SaleOrder, action = Index }匹配才能打開對應(yīng)鏈接。
4.實(shí)現(xiàn)IActionConstraint的路由約束
實(shí)現(xiàn)IActionConstraint約束最簡單的方法是創(chuàng)建派生自System.Attribute的類,并將其置于操作(Action)和控制器(Controller)上。 MVC將自動(dòng)發(fā)現(xiàn)任何應(yīng)用為屬性的IActionConstraint屬性,便對應(yīng)用程序模型應(yīng)用程序進(jìn)行約束。在下面的示例中,對路由數(shù)據(jù)中的國家/地區(qū)選擇操作進(jìn)行約束。
public class CountrySpecificAttribute : Attribute, IActionConstraint { private readonly string _countryCode; public CountrySpecificAttribute(string countryCode) { _countryCode = countryCode; } public int Order { get { return 0; } } public bool Accept(ActionConstraintContext context) { string routeDataValue = context.RouteContext.RouteData.Values["id"] == null ? "" : context.RouteContext.RouteData.Values["id"].ToString(); return string.Equals( routeDataValue, _countryCode, StringComparison.OrdinalIgnoreCase); } } public class HomeController : Controller { [CountrySpecific("en-us")] public IActionResult Index(string id) { return View(); } }
根據(jù)官網(wǎng)解釋IActionConstraint.Order是順序約束意思,比如HomeController 控制器上有[CountrySpecific("en-us")]和[HttpGet](或者其他自定義屬性約束)屬性約束,數(shù)值較低的屬性約束先運(yùn)行。響應(yīng)結(jié)果通過下面表格進(jìn)行分析:
Route?Url |
Result |
[SERVICE_NAME]/Home/Index/en-us |
200 |
[SERVICE_NAME]/Home/Index/zh-cn |
404 |
通過以上的表格可以知道,在此例中,當(dāng)Index傳入路由值(en-us)匹配時(shí),Accept方法返回true以表示該操作是匹配項(xiàng),然后可以打開連接,反之傳入值(zh-cn)不匹配,則404。
原文鏈接:https://www.cnblogs.com/wzk153/p/10996179.html
相關(guān)推薦
- 2022-07-24 python雙向循環(huán)鏈表實(shí)例詳解_python
- 2022-12-26 React生命周期與父子組件間通信知識(shí)點(diǎn)詳細(xì)講解_React
- 2023-03-20 Linq利用Distinct去除重復(fù)項(xiàng)問題(可自己指定)_C#教程
- 2022-09-25 自動(dòng)微分----pytorch中的梯度運(yùn)算與反向傳播函數(shù)(預(yù)備知識(shí))
- 2022-04-27 Quarkus集成redis操作Redisson實(shí)現(xiàn)數(shù)據(jù)互通_Redis
- 2022-04-25 C#使用游標(biāo)實(shí)現(xiàn)補(bǔ)間函數(shù)_C#教程
- 2022-04-04 Kotlin中協(xié)程的創(chuàng)建過程詳析_Android
- 2022-06-12 python文件操作的基礎(chǔ)詳細(xì)講解(write、read、readlines、readline)_p
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支