最新要闻
- 全国4亿人集体“吃土”?沙尘暴持续下该如何保命
- 当前动态:都江堰商业街现多只红嘴相思鸟尸体:专家判断系撞玻璃死亡
- 世界聚焦:菜花蛇、眼镜王蛇、王蛇:谁才真正的毒蛇之王?
- 【播资讯】国产科幻FPS《边境》Steam褒贬不一:UI稀烂 错误频出
- 天天速递!微星RTX 4070魔龙深度测试:老黄的刀法太精准了!
- 环球时讯:老两口搬家花4万,这么多年过去了,搜索引擎“搬家刺客”依然存在?
- 废弃矿井地下水中多环芳烃的降解与迁移机理
- 焦点快播:20亿的交易被华为反对 没任何可能合作 诺基亚坚持要卖鼎桥母公司股权
- 黄仁勋主持 台北电脑展NVIDIA发布会敲定!RTX 4060 Ti/4060要来了
- 焦点消息!《塞尔达传说:王国之泪》终极预告发布:短发公主绝美 盖侬真身登场
- 天天微资讯!仿真-定向耦合器
- 速讯:AMD发布RDNA3架构Radeon Pro W7000系列专业显卡:AI性能提升2.7倍、满血3999美元
- 天天播报:比“500万内最好的SUV”更好!魏牌蓝山上市:27.38万元起
- 当前聚焦:纯白机身美翻了!影驰RTX 4070星曜OC图赏
- 为什么今年沙尘暴突然这么严重?40多年植树造林白干了?
- 环球播报:79888元!大疆Inspire 3发布:全画幅8K电影无人机
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球快讯:ASP.NET Core MVC 从入门到精通之路由
随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启动运行,以及ASP.NET Core MVC的命名约定,创建控制器,视图,模型,接收参数,传递数据等内容,今天继续讲解ASP.NET Core MVC路由等相关内容,仅供学习分享使用。
(资料图片)
什么是路由?
路由是一种机制,主要是用于检查每一个用户请求,将用户请求映射到Action中,这一动作通过路由中间件来实现。ASP.NET Core MVC使用路由中间件来匹配传入请求的URL并将它们映射到操作(Action方法)。
默认路由
在通过模板创建ASP.NET Core MVC中,默认会添加路由中间件,并提供一种默认的路由映射规则和约束。
MapControllerRoute用于创建单个路由。 单个路由命名为default
路由。 大多数具有控制器和视图的应用都使用类似default
路由的路由模板。如下所示:
1 using Microsoft.AspNetCore.Server.Kestrel.Core; 2 using System.Text.Encodings.Web; 3 using System.Text.Unicode; 4 5 var builder = WebApplication.CreateBuilder(args); 6 7 // Add services to the container. 8 builder.Services.AddControllersWithViews().AddJsonOptions(options => 9 {10 options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All);11 });12 13 builder.Services.Configure(options =>14 {15 options.AllowSynchronousIO = true;16 });17 18 var app = builder.Build();19 20 // Configure the HTTP request pipeline.21 if (!app.Environment.IsDevelopment())22 {23 app.UseExceptionHandler("/Home/Error");24 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.25 app.UseHsts();26 }27 28 app.UseHttpsRedirection();29 app.UseStaticFiles();30 //1. 添加路由中间件EndpointRoutingMiddleware31 app.UseRouting();32 33 app.UseAuthorization();34 35 //2.为控制器和Action添加一种路由映射规则,包括名称,规则,约束等36 app.MapControllerRoute(37 name: "default",38 pattern: "{controller=Home}/{action=Index}/{id?}");39 40 app.Run();
在上述代码中,创建默认路由的关键代码如下所示:
1 app.MapControllerRoute(2 name: "default",3 pattern: "{controller=Home}/{action=Index}/{id?}");
其中各个属性说明:
- name表示路由名称,默认值为default。
- pattern 为匹配模板,默认值为"{controller=Home}/{action=Index}/{id?}"。其中默认controller=Home,表示缺省值为HomeController,action=Index,表示默认缺省值为Index。id后面的?表示为可空类型,可以根据需要来填写。
默认路由示例
- 如:/ 表示controller和action都采用默认值,相当于/Home/Index。
- 如:/Hello表示只指定了controller,action为默认缺省值,相当于/Hello/Index。
- 如:/Hello/Test/5 根据路由匹配规则,提取出controller=HelloController , action=Test , id =5 。如果刚好存在此controller和action,则匹配导航成功。
创建默认路由的简便写法,可通过以下代码替代上面的app.MapControllerRoute,如下所示:
1 //创建默认传统路由的简便写法2 app.MapDefaultControllerRoute();
以上是传统路由的示例。 之所以称为传统路由,是因为它为 URL 路径建立了一个约定:
- 第一个路径段
{controller=Home}
映射到控制器名称。 - 第二段
{action=Index}
映射到操作名称。 - 第三段
{id?}
用于可选id
。{id?}
中的?
使其成为可选。id
用于映射到模型实体。
此传统路由映射具有以下特点:
- 仅基于控制器和操作名称。
- 不基于命名空间、源文件位置或方法参数。
使用默认路由进行传统路由可以创建应用,而无需为每个操作提出新的 URL 模式,有助于简化代码。使 UI 更具可预测性。
多个路由
在实际应用中,可以设置多个路由,为某些特定的需求设置专有路由。设置多个路由,如下所示:
1 //2.为控制器和Action添加一种路由映射规则,包括名称,规则,约束等2 app.MapControllerRoute(3 name: "blog",4 pattern: "blog/{*article}",5 defaults: new { controller = "Blog", action = "Article" });6 7 app.MapControllerRoute(8 name: "default",9 pattern: "{controller=Home}/{action=Index}/{id?}");
在上述代码中,名称为blog的路由,虽然采用的是传统路由,但只用于特定操作。
在创建多个路由时,以下几点需要注意:
blog
路由比default
路由具有更高的匹配优先级,因为它最先添加。- 路由名称为路由指定逻辑名称,使用命名路由可以简化 URL 创建,在应用程序范围内必须唯一。
- 默认情况下,传统路由依赖于顺序。 一般情况下,具有区域的路由应放在路由表中靠前的位置,因为它们比没有区域的路由更具体。也就是:特殊的在前面,通用的在后面。
不明确操作
如果同一个请求有两个action都满足路由终结点的匹配,那么路由会进行如下处理:
- 选择最佳的候选项。
- 引发异常。
如下代码,在请求时,会两个都满足路由匹配规则:
1 ///2 /// 请求需要编辑的学生信息 3 /// 4 /// 5 ///6 public IActionResult Edit(int id) 7 { 8 var student = new Student() 9 {10 Id = 1,11 Name = "公子小六",12 Age = 21,13 Sex = "男"14 };15 return View();16 }17 18 /// 19 /// 编辑后保存学生信息20 /// 21 /// 22 /// 23 ///24 public IActionResult Edit(int id, Student student)25 {26 //保存学生27 return View();28 }
那么路由中间件就会跑出异常,如下所示:
在这种情况下,要解析正确的路由,需要通过Http谓词来区分,只有当请求为Post时,才会请求Edit(int id,Student student);其他请求时【一般为Get】,匹配Edit(int id)。添加Http谓词后的代码如下:
1 ///2 /// 请求需要编辑的学生信息 3 /// 4 /// 5 ///6 public IActionResult Edit(int id) 7 { 8 var student = new Student() 9 {10 Id = 1,11 Name = "公子小六",12 Age = 21,13 Sex = "男"14 };15 return View();16 }17 18 /// 19 /// 编辑后保存学生信息20 /// 21 /// 22 /// 23 ///24 [HttpPost]25 public IActionResult Edit(int id, Student student)26 {27 //保存学生28 return View();29 }
属性路由
属性路由一般用于WebAPI,使用一组属性将操作直接映射到路由模板,将应用功能建模为一组资源。属性路由使用[Route(template)]标记于controller或action中,示例如下所示:
1 public class TestController : Controller 2 { 3 4 [Route("Test1")] 5 [Route("Test1/Index")] 6 [Route("Test1/Index/{id?}")] 7 public IActionResult Index(int id) 8 { 9 ViewBag.Id = id;10 return View();11 }12 13 public IActionResult Test()14 {15 return View();16 }17 }
运行程序,在浏览器中,输入网址【https://localhost:7116/Test1/Index/10】,如下所示:
注意:属性路由中,也可用标记:[Route("[controller]/[action]")],效果可传统路由一致。
属性路由与传统路由对比
经过以上示例,属性路由与传统路由,主要由以下几点差异:
- 属性路由需要更多输入才能指定路由,属性路由自定义比较强,更能精准控制路由。
- 传统默认路由会更简洁地处理路由。
- 属性路由优先级高于传统路由。对于属性路由,控制器和操作名称在操作匹配中不起作用,除非使用标记替换。
- 属性路由支持定义多个访问同一操作的路由,意味着每个路由属性都与操作方法上的每个路由属性相结合。
- 属性路由支持使用与传统路由相同的内联语法,来指定可选参数、默认值和约束。如:[HttpPost("product14/{id:int}")]
保留关键字
在ASP.NET Core MVC项目中,会有一些关键字,作为路由参数名称,如下所示:
action
area
controller
handler
page
在 Razor 视图或 Razor 页面的上下文中保留以下关键字:
page
using
namespace
inject
section
inherits
model
addTagHelper
removeTagHelper
一个常见错误是使用page
作为属性路由的路由参数。 这样做会导致与 URL 生成不一致和令人困惑的行为。错误示例如下所示:
1 public class TestController : Controller2 {3 [Route("/articles/{page}")]4 public IActionResult ListArticles(int page)5 {6 return View(page);7 }8 }
Http谓词和路由模板
在ASP.NET Core MVC项目中,具有以下几种谓词,用于区分不同的请求方式:
- [HttpGet]
- [HttpPost]
- [HttpPut]
- [HttpDelete]
- [HttpHead]
- [HttpPatch]
ASP.NET Core 具有以下路由模板:
- 所有HTTP 谓词模板都是路由模板。
- [Route]
混合路由:属性路由与传统路由
ASP.NET Core 应用可以混合使用传统路由和属性路由。 通常,对为浏览器提供 HTML 页的控制器使用传统路由,对为 API 提供服务 REST 的控制器使用属性路由。
操作既支持传统路由,也支持属性路由。 通过在控制器或操作上放置路由可实现属性路由。 不能通过传统路由访问定义属性路由的操作,反之亦然。 控制器上的任何路由属性都会使控制器中的所有操作使用属性路由。
属性路由和传统路由使用相同的路由引擎。
以上就是ASP.NET Core MVC从入门到精通之路由的全部内容,旨在抛砖引玉,一起学习,共同进步。
关键词:
环球快讯:ASP.NET Core MVC 从入门到精通之路由
全国4亿人集体“吃土”?沙尘暴持续下该如何保命
当前动态:都江堰商业街现多只红嘴相思鸟尸体:专家判断系撞玻璃死亡
世界聚焦:菜花蛇、眼镜王蛇、王蛇:谁才真正的毒蛇之王?
【播资讯】国产科幻FPS《边境》Steam褒贬不一:UI稀烂 错误频出
天天速递!微星RTX 4070魔龙深度测试:老黄的刀法太精准了!
环球时讯:老两口搬家花4万,这么多年过去了,搜索引擎“搬家刺客”依然存在?
废弃矿井地下水中多环芳烃的降解与迁移机理
1811 E Living Sequence 两种解法
ChatGPT进化,人性消失,究竟是好是坏?
每日聚焦:第137篇:重学ES6模块化
天天热门:容器操作,应用部署,迁移与备份,Dockerfile
焦点快播:20亿的交易被华为反对 没任何可能合作 诺基亚坚持要卖鼎桥母公司股权
黄仁勋主持 台北电脑展NVIDIA发布会敲定!RTX 4060 Ti/4060要来了
焦点消息!《塞尔达传说:王国之泪》终极预告发布:短发公主绝美 盖侬真身登场
天天微资讯!仿真-定向耦合器
今日报丨java 处理常量字符串过长 & springboot 项目读取 resouces 文件夹下的文件内容
ORACLE还原恢复启动时数据库报ORA-00704, ORA-00604, ORA-00904
世界速读:linux环境下安装Docker
世界关注:百度松果菁英班--oj赛(第二次)
面试题百日百刷-kafka篇(三)
速讯:AMD发布RDNA3架构Radeon Pro W7000系列专业显卡:AI性能提升2.7倍、满血3999美元
天天播报:比“500万内最好的SUV”更好!魏牌蓝山上市:27.38万元起
当前聚焦:纯白机身美翻了!影驰RTX 4070星曜OC图赏
为什么今年沙尘暴突然这么严重?40多年植树造林白干了?
环球播报:79888元!大疆Inspire 3发布:全画幅8K电影无人机
葵花药业实控人杀妻案4年后:两女儿接班
【世界独家】大疆悟3曝光:吊着一台摄像机 支持8K 75fps视频录制
每年减少6吨补给 我国空间站氧气100%再生:已达世界领先水平
环球今日报丨强力透气 森马旗下棉致男士冰丝休闲裤34.5元
当前热点-夜莺监控V6初探
每日关注!双碳ETF: 招商基金管理有限公司关于旗下基金投资关联方承销证券的公告
热讯:苹果寻觅中国制造之外新选择:正推动将MacBook转到泰国组装
今日看点:安卓之光未发先火!超1000位米粉下单小米13 Ultra
巴菲特对苹果推崇至极!出1万美元买不走你的iPhone但能买走你的福特车
当前快报:新能源厂商销量榜 长城、五菱、小鹏汽车全部接近腰斩
环球焦点!飞腾CPU走出国门 非洲电厂将用上“中国芯”
每日关注!Java GC基础知识
天天微资讯!KMP(字符串匹配算法)
焦点快报!银行发现7位数存款5年未动急寻人:联系电话是空号
每日热文:RTX 4090与RTX 3080 Ti移动旗舰显卡大PK:没想到性能差距巨大
自动驾驶为啥这么难!技术问题?还是方向错了?
每日视点!T-1000未来或成真!《终结者》之父:AI太强可以造成世界末日
焦点消息!被狗抓破是否会得狂犬病上热搜:博主“科普”网友纷纷不认账
当前热门:三分钟完成静态网站托管
每日视讯:ChatGPT吃我饭,还要掀我碗
cookies、sessionStorage与localStorage在Vue中的使用
有关拦截器拦截指定的url并作出处理返回数据
环球热点评!皇马这批人如果拿到6个欧冠,历史地位也没变化?受害者只有C罗?
环球短讯!华为5G回来了?余承东体验AITO问界M5智驾版:重大更新引人遐想
疯狂白菜价 DDR5正式跌破百元 国产枭鲸8GB内存只要99.9元
全球观热点:表现持平GPT-4!知乎“知海图AI”投入内测
《终结者》之父卡梅隆:AI太厉害将能造成世界末日
环球速读:云南万人大型泼水现场互送祝福:欢度泼水节
全球即时:全栈混合云综合架构方案研究和落地
环球观热点:详解GaussDB(DWS)的query_band负载识别与应用
快看:零基础快速入门WebRTC:基本概念、关键技术、与WebSocket的区别等
【世界时快讯】Java集成工作流审批机制,多个项目实际运用优化版本(干货)
世界快播:Natasha入门(一)
环球观热点:恒生指数13日收涨0.13% 生物医药行业领涨
焦点报道:许昌市东城区:普法宣传进校园 精心护苗筑平安
【全球时快讯】NVIDIA最新调查:80%的RTX 40系显卡用户会启用光追和DLSS
【天天播资讯】侧透玻璃机箱!微星海皇戟AS台式机上新:i7+RTX 4070
世界新消息丨同跑硬件杀手《赛博朋克2077》 RTX 4080与RTX 4090有多大差距?
世界今日讯!Win掌机不用指头戳屏幕了!Win12有望加入“掌机模式”
世界微动态丨下周一!国内油价预计涨0.44元/升 或创今年最大涨幅
尼尔森IQ:中国消费市场回暖 绿色变革赋能品牌可持续增长
天天速读:MegEngine 使用小技巧:使用 Optimizer 优化参数
每日动态!图片压缩&视频截取
全球观速讯丨Mac | iOS | Windows:安装Stable diffusion教程
世界短讯!科创板收盘播报:科创50指数低开低走跌2.59% 软件服务及半导体股跌幅居前
世界热讯:简历上写QQ邮箱会掉分吗引热议 网友:邮箱也分三六九等?
全焦段光学覆盖!小米13 Ultra影像参数公布:1+3黄金组合
环球消息!4999元起 荣耀MagicBook 14 2023笔记本发布:5项世界第一
天天即时:优酷回应非会员遇3000多秒广告:bug已修复 是文案显示问题
iPhone 15 Pro固态按键设计临时改了!只因难度太大
天天最资讯丨动态代理与Spring AOP
在LINQPad中使用FreeSql查询数据库
minio分片上传
12函数进阶
环球快看点丨[Docker]Namespace与Cgroups
快看:本周最火AutoGPT!GitHub3.6万+标星:解决复杂任务全程无需人类插手
环球微速讯:性能升级 13代酷睿来了? 华为MateBook笔记本新品即将发布
曾力推每天睡4小时 张朝阳建议年轻人别睡懒觉不要熬夜
每日动态!李书福抢跑马斯克发小钢炮!冰箱彩电大沙发全标配:理想直呼内行
【环球热闻】售价高达15000元!宾得专为黑白摄影推出K-3 Mark III Monochrome
金色的草地课文朗读音频_金色的草地课文
焦点精选!论结构化、系统性的学习
【天天热闻】RocketMQ是是如何管理消费进度的?又是如何保证消息成功消费的?
【天天聚看点】C# 根据前台传入实体名称,动态查询数据
每日关注!电商流量分析怎么做?试试这款数据工具 DataLeap!
Intel突然杀死服务器整机业务!新CEO连砍十余刀挽救亏损
马保国直播带货现演“闪电五连鞭”:销量惨淡 网友只看不买
手把手教你如何免费Midjourney Adobe FireFly AI绘图—Window本地快速部署stable diffusion AI绘图及使用指南(小白
克里克森_克里克拉克
每日速递:日本部分地区出现大量黄沙:能见度不足10公里
环球热点!高颜值!关晓彤晒华为nova 11:本月发
每日资讯:开启影像光学新时代!小米13 Ultra搭载全焦段5000万像素徕卡四摄
真反向虚标!实测比亚迪秦PLUS EV冠军版:标610开出646.5
5.98万起真不贵!五菱缤果上市两周狂卖10000台:再成爆款