(8)ASP.NET Core2.2 中的MVC路由一 - 教程

news/2025/10/11 14:53:47/文章来源:https://www.cnblogs.com/wzzkaifa/p/19132940

1.前言

ASP.NET Core MVC使用路由中间件来匹配传入请求的URL并将它们映射到操作(Action方法)。路由在启动代码(Startup.Configure方法)或属性(Controller Action属性)中定义。路由描述应如何将URL路径与操作(Action方法)相匹配。它还用于在响应中生成送出的URL。路由操作可以设置中间件,支持传统路由、属性理由(通过在Controller Action上放置理由可实现)、多个路由。

2.设置路由中间件

在Configure方法中,可能会看到与下面类似的设置路由中间件代码:

app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});

等价于

//默认模版就是 "{controller=Home}/{action=Index}/{id?}"
app.UseMvcWithDefaultRoute();

在UseMvc的匿名方法中,MapRoute表示创建单个路由,指定为默认(default)路由、路由模版“{controller=Home}/{action=Index}/{id?}”。
路由模版“{controller=Home}/{action=Index}/{id?}”的意思是可以匹配“/Home/Index/5”的URL路径。也就是说:
●{controller=Home}将Home定义为默认controller。
●{action=Index}将Index定义为默认action。
●{id?}将id定义为可选参数。
UseMvc和UseMvcWithDefaultRoute可向中间件管道添加RouterMiddleware的实例。MVC不直接与中间件交互,而是使用路由来处理请求。MVC通过MvcRouteHandler实例连接到路由。 重载UseMvc(Action<IRouteBuilder>) 则允许用户添加自己的路由,并且还支持属性路由。UseMvcWithDefaultRoute定义默认路由并支持属性路由。

3.传统路由

默认路由:

routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");

上述代码就是一个传统路由,将这种方式称为传统路由的原因在于,它为URL路径设立了一个约定:
●第一个路径段映射到控制器名称。
●第二段映射到操作名称。
●第三段用于可选id(用于映射到模型实体)。

使用此default路由时,URL路径/Home/Index映射到HomeController.Index。此映射仅基于控制器和操作(action)名称,而不基于命名空间、源文件位置或方法参数。

4.多个路由

4.1定义多个路由

通过对UseMvc匿名方法添加多个路由,这样做可以定义多个约定或添加专用于特定操作的传统路由,比如:

app.UseMvc(routes =>
{
//第一个路由
routes.MapRoute("blog", "blog/{*article}",defaults: new { controller = "Blog", action = "Article" });
//第二个路由
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

第一个路由里{*article}是表示使用catch-all路由参数来捕获URL路径的剩余部分。下面我们通过测试来验证下:

●"blog/{*article}":


●"blog/{article}":

通过上述测试可以知道,加星号的路由在传参字符串中加了斜杠依然能够打开,没加星号的路由在传参字符串中加了斜杠就不能打开了。还有一点要注意的是controller.action接收参数必须跟*后面参数名称一致,不然会接收不到参数值。

4.2区分操作

当controller存在两个action名称一致的方法,MVC必须要进行区分,不然会引发异常,例如:

public class BlogController : Controller
{
public IActionResult Edit(int id) {}
[HttpPost]
public IActionResult Edit(int id, Blog blog) {}
}

当请求为HTTP POST时MVC会选择Edit(int, Blog),在Http属性为任何其他内容时选择 Edit(int)。如果匹配多个路由,而MVC找不到“最佳”路由Action时,则会引发 AmbiguousActionException异常。

5.属性路由

5.1 属性路由

属性路由使用一组属性将操作(Action)直接映射到路由模板。 在下面的示例中,Configure 方法使用app.UseMvc(),不传递任何路由。HomeController将匹配一组URL,这组URL与默认路由{controller=Home}/{action=Index}/{id?}匹配的URL类似:

public class HomeController : Controller
{
[Route("")]
[Route("Home")]
[Route("Home/Index")]
public IActionResult Index()
{
return View();
}
}

下面我们通过表格来看看每个属性路由在浏览器上打开链接是怎样的效果。

Route TemplateBrowserPage
Route("")[SERVICE_NAME] [SERVICE_NAME]/Home/Index
Route("Home") [SERVICE_NAME]/Home
Route("Home/Index")[SERVICE_NAME]/Home/Index

三种属性路由在浏览器上打开链接方式都不一样,但是呈现页面是一样的,也就是说三个属性路由的定义方式都是指向同一个/Home/Index页面。到这里或许大伙会有疑问,如果我把三个属性路由模版名称都改变下,那会能打开同一个页面么?

[Route("1")]
[Route("Home1")]
[Route("Home1/Index1")]

上述模版名称更改了,但是在浏览器呈现页面还是指向/Home/Index的,也就是说,无论属性路由模版名称如何更改总能打开对应/Home/Index页面。

5.2 使用 Http[Verb] 属性的属性路由

属性路由还可以使用Http[Verb]属性,比如HttpPostAttribute。所有这些属性都可采用路由模板。此示例展示与同一路由模板匹配的两项操作:

public class BlogController : Controller
{
[HttpGet("/article/{id}", Name = "Article_List")]
public IActionResult Article(string id)
{
return View();
}
}

当我们在浏览器上输入[SERVICE_NAME]/article/1时候,通过DEBUG我们可以看到响应结果:

通过响应结果可以知道属性路由首先将URL与路由属性定义的路由模板集([HttpGet("/article/{id}", Name = "Article_List")])进行匹配。一旦某个路由模板匹配,就会应用IActionConstraint约束来确定可以执行的操作。

5.3合并路由

根据业务场景如果我们需要将某个Controller重新命名为以便访问该Controller下面所有action,那么该如何设置呢?下面通过示例来演示下:

[Route("homes")]
public class HomeController : Controller
{
[HttpGet("{id}")]
public IActionResult Index()
{
return View();
}
}

根据上述代码,在HomeController上放置路由属性([Route("homes")])会使控制器中的所有操作(Action)都使用该属性路由。也就是说只有URL HTTPGet :[SERVICE_NAME]/homes/1才能访问Index视图。这种做法好处是,HomeController下的每个Action操作不用单独添加Route("homes")属性,只需要在HomeController外放置一个全局Route("homes")属性即可应用到每个Action去,减少路由属性重复。

5.4指定属性路由的可选参数、默认值和约束

属性路由同时也支持使用与传统路由相同的内联语法,来指定可选参数、默认值和约束。下面请看示例:

public class HomeController : Controller
{
[HttpGet("homes/{id:int}")]
public IActionResult Index(int id)
{
return View();
}
}

上述代码执行结果我们通过表格来看看效果:

BrowserResult status
[SERVICE_NAME]/homes/1200
[SERVICE_NAME]/homes/qwe404

[HttpGet("homes/{id:int}")]把传入id参数值约束为只有数字才能打开该属性下视图,如果传入是字符串则无法找到该视图。而更多路由约束模板在这里参阅。

5.4自定义属性路由

我们可以通过框架自带的IRouteTemplateProvider接口自定义路由属性(例如类似[HttpGet]、[Route("homes")]等属性)。当应用程序启动时,MVC会查找控制器类和操作方法上的属性,并使用实现IRouteTemplateProvider的属性生成一组初始路由。此部分通过一个简单的示例说明了如何使用应用程序自定义属性路由:

public class MyControllerAttribute : Attribute, IRouteTemplateProvider
{
//实现接口的三个属性,这里的[controller]是一个标记替换。
public string Template => "api/[controller]/{action}/{id?}";
public int? Order { get; set; }
public string Name { get; set; }
}

新建一个路由属性类自定义属性路径,然后在Controller或者Action上放置自定义属性路由。

public class BlogController : Controller
{
[MyController()]
public IActionResult Article(string id)
{
return View();
}
}

通过执行[SERVICE_NAME]/api/Blog/Article/1链接时访问成功,也就是说自定义属性路由成功。

参考文献:
在 ASP.NET Core 中路由到控制器操作https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED无线打气泵方案芯片(CSU18P88)

无线打气泵是一种常见的气体压缩设备,它可以将空气或其他气体压缩成高压气体,用于充气、输送、压缩等工业和生活领域。打气泵的原理是利用机械或电动力量将气体压缩,使其体积减小,压力增大,从而达到充气的目的。无…

穿透式监管合规:政府投资基金数字化报送实践(璞华公开课第4期活动回顾)

2025年9月12日,由苏州市金融科技协会指导、璞华科技有限公司主办的第 4 期线上公开课 ——“穿透式监管合规:政府投资基金数字化报送实践” 顺利收官。本次公开课聚焦政府投资基金监管痛点,结合政策要求与实践案例,…

PiXYZ Studio 2021:Unity 生态下工业级 3D 数据处理的效率革命

在工业设计与实时 3D 开发领域,复杂 CAD 模型的导入、优化与衔接始终是影响项目效率的关键环节。Unity 推出的PiXYZ Studio 2021,正是针对这一痛点打造的专业 3D 数据准备与优化工具 —— 它通过自动化批处理、实时协…

国产项目管理工具Gitee:数字化转型浪潮中的本土化破局者

国产项目管理工具Gitee:数字化转型浪潮中的本土化破局者 当今企业数字化转型已进入深水区,项目管理工具作为提升协作效率的核心引擎,正经历着从"能用"到"好用"的质变过程。在这一领域,国际巨头…

网络安全领域没有真正的初级岗位

本文深入探讨网络安全领域初级岗位的特殊性,强调扎实的技术基础在安全领域的重要性,包括系统架构、网络知识和编程能力等核心技能,为想要进入该领域的人提供实用建议。网络安全领域没有真正的"初级"岗位 …

2025年磁翻板液位计生产商,制造商哪家好?生产厂家推荐这家!

河北光科测控设备有限公司成立于2009年,注册资金1100万,公司坐落在燕赵大地河北邯郸,占地面积70余亩,已通过ISO9001-2015质量管理体系、ISO14001-2015环境管理体系、ISO45001-2018职业健康安全管理体系三体系认证。…

2025牛客暑期多校训练营4

For the Treasury! 题意简化 在公元11世纪早期的英格兰,有维京海盗团伙。阿斯凯拉德作为一伙维京海盗的首领,要分\(n\)件排成一列的财宝,按约定他本应拿前\(k\)件。但他夜里偷偷调换财宝(每次只能交换相邻两件,每…

软件测试进阶之路:2025年测试工程师必须掌握的三大热门领域

技术进步永无止境,测试工程师唯有不断学习、持续进阶,才能在快速变化的技术 landscape 中保持核心竞争力。希望本文能为您的测试进阶之路提供有益指引。在软件工程日益复杂的今天,测试工程师的角色正经历深刻变革。…

实用指南:Qt QEventLoop的使用的一个问题讨论

实用指南:Qt QEventLoop的使用的一个问题讨论pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

Putty设置SSH隧道,隧道和代理的原理区别(KIMI)

Putty设置SSH隧道,隧道和代理的原理区别(KIMI)本文内容为和AI大模型KIMI的对话记录,仅供参考。User: 我有一台服务器,用putty和winscp能够登录,但是jupyterlab启动后无法从笔记本的浏览器进入,应该如何设置?需…

创新突破!天翼云TeleDB数据库通过中国信通院数据库迁移工具专项测试

近日,天翼云数据传输服务软件(DTS)依据《数据库迁移工具能力要求》,结合天翼云TeleDB数据库产品,顺利通过中国信息通信研究院(简称“中国信通院”)“可信数据库”数据库迁移工具专项测试。测试结果表明,天翼云…

Node.js基础库介绍与使用

Node.js 核心库是内置的、无需安装的模块,提供了文件操作(fs)、网络通信(http/https)、路径处理(path)、工具函数(util)、事件驱动(events)、流处理(stream)和加密(crypto)等基础功能,是其强大能力的基…

gaussdb常用操作 - 吾辈当奋斗

启停# root登录 su - gauss # 停止 gs_ctl stop # 启动 gs_ctl start# 单节点启动 su - gauss gssp# 不常用的操作 # 停止gaussdb gs_ctl stop -D 路径 # 启动gaussdb gs_ctl start -D 路径 # 重启gaussdb gs_ctl res…

Go语言熟练使用指南

掌握 Go 语言并达到熟练水平需要系统学习以下几个方面的内容: 一、语言基础核心基础语法和特性 变量声明:var vs 短声明 :=数据类型:基本类型、复合类型、类型转换 控制结构:if/else、for循环、switch 函数:多返回…

Webpack与Vite原理深度解析

好的,我们来深入浅出地解析一下 Webpack 和 Vite 的原理。这两者都是现代前端领域非常重要的构建工具,但它们的核心思想和实现方式有根本性的不同。 核心思想对比特性 Webpack Vite核心理念 Bundle(打包)。将所有模…

详细介绍:华为路由基础1

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

UMich EECS 498-007 / 598-005: Deep Learning for Computer Vision

UMich EECS 498-007 / 598-005: Deep Learning for Computer Vision 资源

IIS8.5 安装证书

问题:iis8.5 导入证书后消失(在IIS中不可见,在证书管理中可以看到,显示缺少私钥)。也可使使用工具查看证书的安装情况 解决方案:参考: openSSL 命令:openssl pkcs12 -export -out output.pfx \ -inkey server.…

2025南通婚纱摄影厂家最新推荐榜:匠心工艺与浪漫美学完美结合

2025婚纱摄影厂家最新推荐榜:匠心工艺与浪漫美学完美结合在当代婚庆消费升级的浪潮中,婚纱摄影行业正经历着深刻的变革。据行业数据显示,2024年中国婚纱摄影市场规模已突破千亿元,新人对婚纱照的需求从简单的场景记…

免费音乐软件,哔哔音乐 免费下载及安装!免费音乐播放器

软件介绍 哔哔音乐是一款基于 B 站音乐资源开发的开源免费音乐播放器,支持安卓和 PC 端。软件下载 哔哔音乐下载地址软件功能特点 操作便捷:软件无须注册登录,打开即可使用,界面简洁,主要有搜索、广场、歌单和设置…