随着技术的发展,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<KestrelServerOptions>(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. 添加路由中间件EndpointRoutingMiddleware
31 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?}");
其中各个属性说明:
创建默认路由的简便写法,可通过以下代码替代上面的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 路由具有更高的匹配优先级,因为它最先添加。
如果同一个请求有两个action都满足路由终结点的匹配,那么路由会进行如下处理:
如下代码,在请求时,会两个都满足路由匹配规则:
1 /// <summary>
2 /// 请求需要编辑的学生信息
3 /// </summary>
4 /// <param name="id"></param>
5 /// <returns></returns>
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 /// <summary>
19 /// 编辑后保存学生信息
20 /// </summary>
21 /// <param name="id"></param>
22 /// <param name="student"></param>
23 /// <returns></returns>
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 /// <summary>
2 /// 请求需要编辑的学生信息
3 /// </summary>
4 /// <param name="id"></param>
5 /// <returns></returns>
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 /// <summary>
19 /// 编辑后保存学生信息
20 /// </summary>
21 /// <param name="id"></param>
22 /// <param name="student"></param>
23 /// <returns></returns>
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]")],效果可传统路由一致。
属性路由与传统路由对比
经过以上示例,属性路由与传统路由,主要由以下几点差异:
在ASP.NET Core MVC项目中,会有一些关键字,作为路由参数名称,如下所示:
actionareacontrollerhandlerpage在 Razor 视图或 Razor 页面的上下文中保留以下关键字:
pageusingnamespaceinjectsectioninheritsmodeladdTagHelperremoveTagHelper一个常见错误是使用 page 作为属性路由的路由参数。 这样做会导致与 URL 生成不一致和令人困惑的行为。错误示例如下所示:
1 public class TestController : Controller
2 {
3 [Route("/articles/{page}")]
4 public IActionResult ListArticles(int page)
5 {
6 return View(page);
7 }
8 }
在ASP.NET Core MVC项目中,具有以下几种谓词,用于区分不同的请求方式:
ASP.NET Core 具有以下路由模板:
ASP.NET Core 应用可以混合使用传统路由和属性路由。 通常,对为浏览器提供 HTML 页的控制器使用传统路由,对为 API 提供服务 REST 的控制器使用属性路由。
操作既支持传统路由,也支持属性路由。 通过在控制器或操作上放置路由可实现属性路由。 不能通过传统路由访问定义属性路由的操作,反之亦然。 控制器上的任何路由属性都会使控制器中的所有操作使用属性路由。
属性路由和传统路由使用相同的路由引擎。
以上就是ASP.NET Core MVC从入门到精通之路由的全部内容,旨在抛砖引玉,一起学习,共同进步。
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie
文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方
目录1古彝文与古典保护2古文识别的挑战2.1西文与汉文OCR2.2古彝文识别难点3合合信息:古彝文保护新思路3.1图像矫正3.2图像增强3.3语义理解3.4工程技巧4总结1古彝文与古典保护彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意义上的彝文,古彝文指的是在民间流通使用的原生态彝文,多达87046字。古彝文的起源距今至少数千年,是世界上最古老的文字之一。对古彝文字集研究有助于理解尚未被翻译成汉文、用字尚未规范化的古籍,更深层、透彻地作用于传统文化保护。古彝文字义对照图(网络资料+邵文苑供图)古籍是不可再生的宝贵资源,应当得到妥善保护。中国的古籍在历史上迭经水火兵燹等自然灾害、