【ASP.NET Core 基础知识】--路由和请求处理--路由概念(二)

一、路由参数传递方式

1.1 查询字符串参数

在路由中,查询字符串参数是一种常见的方式传递信息。这种方式通过URL中的查询字符串(?key1=value1&key2=value2)将参数附加到请求中。在ASP.NET Core中,可以通过以下方式在控制器动作方法中接收查询字符串参数:

public class MyController : Controller
{public IActionResult MyAction(){// 通过Request对象获取查询字符串参数string parameter1 = HttpContext.Request.Query["param1"];// 或者通过动作方法的参数直接接收查询字符串参数public IActionResult MyAction(string param1, int param2){// ...}// 示例URL:/MyController/MyAction?param1=value1&param2=42}
}

在上述例子中,查询字符串参数通过HttpContext.Request.Query对象获取,或者通过在动作方法的参数中直接声明,系统将自动进行参数绑定。这种方式对于传递较少且非敏感信息非常方便。

1.2 路由值参数

路由值参数是通过路由模板定义的占位符来捕获和传递的参数。在ASP.NET Core中,路由值参数通常由花括号 {} 包围,它们从URL中提取相应的值。以下是路由值参数的使用方式:

public class MyController : Controller
{// 路由模板包含{id},它将作为路由值参数传递给动作方法[HttpGet("Products/{id}")]public IActionResult GetProductById(int id){// 使用id参数执行相应的逻辑}// 示例URL:/Products/123
}

在上述例子中,{id}是一个路由值参数,它会从URL中匹配的位置提取相应的值传递给GetProductById方法的id参数。路由值参数的使用使得动作方法能够根据URL的结构动态地处理不同的请求。

1.3 表单参数

表单参数是通过HTML表单提交的数据,通常使用POST请求发送到服务器。在ASP.NET Core中,可以通过动作方法的参数直接接收表单参数。以下是处理表单参数的基本示例:

public class MyController : Controller
{// 显示表单页面[HttpGet]public IActionResult MyForm(){return View();}// 处理表单提交[HttpPost]public IActionResult MyForm(string username, string password){// 使用接收到的表单参数执行相应的逻辑// username和password是表单中的input元素的name属性值}
}

在上述例子中,MyForm方法处理表单提交,通过参数usernamepassword直接接收表单中相应元素的值。这种方式称为模型绑定,ASP.NET Core会自动将表单数据绑定到方法参数。

二、路由生成

2.1 使用UrlHelper生成URL

在ASP.NET Core中,UrlHelper是一个用于生成URL的实用程序类,它提供了生成各种类型URL的方法。以下是使用UrlHelper生成URL的基本示例:

public class MyController : Controller
{public IActionResult MyAction(int id){// 使用UrlHelper生成URLstring url = Url.Action("MyAction", "MyController", new { id = id });// 或者在视图中使用// string url = Url.Action("MyAction", "MyController", new { id = 42 });// 执行其他逻辑...}
}

在上述例子中,Url.Action方法用于生成MyController控制器中的MyAction动作方法的URL,同时传递了id参数。生成的URL将包含相应的路由信息。这样的方式非常灵活,可以确保生成的URL符合应用程序的路由规则。

2.2 命名路由

命名路由是为特定路由规则分配一个唯一的名称,以便在应用程序中引用和生成URL时使用。在ASP.NET Core中,可以通过在路由配置中使用name参数为路由指定名称。以下是使用命名路由的示例:

public class MyController : Controller
{// 命名路由配置[HttpGet("Products/{id}", Name = "ProductDetails")]public IActionResult GetProductById(int id){// 执行相应的逻辑...}// 在其他地方引用命名路由public IActionResult AnotherAction(){// 通过命名路由生成URLstring url = Url.RouteUrl("ProductDetails", new { id = 42 });// 执行其他逻辑...}
}

在上述例子中,HttpGet特性中的Name参数为路由指定了名称为ProductDetails。在AnotherAction方法中,可以使用Url.RouteUrl方法通过命名路由生成URL,确保生成的URL符合ProductDetails路由规则。这种方式在应用程序中的路由配置较复杂时非常有用。

三、区域化路由

在 ASP.NET Core 中,区域化路由是一种将应用程序分成多个区域,并为每个区域定义特定路由的技术。通过使用区域化路由,可以更好地组织和管理应用程序的不同部分,同时提高应用程序的可维护性和可扩展性。
区域化路由通常是在 Startup.cs 文件中配置的,具体来说,是在 Configure 方法中使用 MapAreaControllerRouteMapAreaRoute 方法来定义区域路由。例如:

app.UseEndpoints(endpoints => {endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");endpoints.MapAreaControllerRoute(name: "areas",areaName: "admin",pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");endpoints.MapControllers();
});

在上述代码中,定义了一个名为 default 的路由,它对应于根区域的控制器。然后,使用 MapAreaControllerRoute 方法定义了一个名为 areas 的区域路由,该区域的名称为 admin,并为该区域的控制器定义了相应的路由规则。
另外,还可以通过在控制器上添加 Area 属性来指定该控制器属于哪个区域。例如:

[Area("admin")]
public class HomeController : Controller {}

这样,当请求到达该控制器时,ASP.NET Core 将根据 Area 属性的值将其路由到相应的区域。此配置允许通过URL指定语言/地区,例如/en-US/Home/Index,并在控制器和视图中使用本地化资源。

四、路由中间件

路由中间件在ASP.NET Core中起着关键作用,它负责根据传入的HTTP请求确定应该由哪个控制器的哪个动作方法来处理。以下是关于ASP.NET Core中路由中间件的一些关键概念:

  1. 路由中间件的位置: 路由中间件通常位于中间件管道中的早期位置,以确保在请求到达控制器之前进行路由解析。
  2. 路由模板: 路由中间件使用路由模板定义路由规则,其中包括控制器、动作方法以及其他可能的参数。
  3. 默认路由: ASP.NET Core应用程序通常包含一个默认的路由规则,例如 {controller}/{action}/{id?},其中{controller}表示控制器名,{action}表示动作方法名,{id?}表示可选的参数。
  4. 路由参数: 路由参数可以从URL中提取,包括路由模板中的占位符,例如 {controller}{action}{id}
  5. 路由匹配: 路由中间件根据请求的URL和路由规则,确定应该由哪个控制器和动作方法处理。
  6. 路由生成: 在应用程序中,可以使用Url.ActionUrl.RouteUrl等方法通过路由生成器生成URL,确保符合路由规则。
// 通过路由生成器生成URL
string url = Url.Action("Index", "Home", new { id = 42 });
  1. 路由约束: 路由中间件支持使用约束来限制参数的格式、长度、范围等,以确保路由匹配的精确性。
  2. 区域路由: 路由中间件也支持区域路由,通过在路由规则中包含 {area} 占位符来实现。
[Area("Admin")]
public class AdminController : Controller
{// ...
}

总体而言,路由中间件在ASP.NET Core中是非常关键的一部分,它使得应用程序能够根据传入的请求路由到正确的控制器和动作方法,实现灵活的URL处理和路由规则。

五、总结

总体而言,深入了解了如何优雅地组织和处理Web应用的URL结构,提升了应用的可维护性和灵活性。

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

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

相关文章

c++学习之IO流

目录 前言: 一,流的概念 二,c的io流 输入输出流 缓冲区的同步 文件流 文件的打开 文件读写自定义类型数据 字符流 1. 将数值类型数据格式化为字符串 2. 字符串拼接 3. 序列化和反序列化结构数据 前言: 在了解c的输入输…

SpringBoot异常处理和单元测试

学习目标 Spring Boot 异常处理Spring Boot 单元测试 1.SpringBoot异常处理 1.1.自定义错误页面 SpringBoot默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 springBoot…

c语言->学会offsetof宏计算结构体相对偏移量

前言 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 目的,学习offsetof宏计算结构体相对偏移量 1.offsetof宏 来我们看图…

vector讲解

在学习玩string后我们开始学习vector,本篇博客将对vector进行简单的介绍,还会对vector一些常用的函数进行讲解 vector的介绍 实际上vector就是一个数组的数据结构,但是vector是由C编写而成的,他和数组也有本质上的区别&#xff…

2.机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

2️⃣机器学习-K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解 个人简介一算法概述二算法思想2.1 KNN的优缺点 三实例演示3.1电影分类3.2使用KNN算法预测 鸢(yuan)尾花 的种类3.3 预测年收入是否大于50K美元 个人简介 🏘️&…

android 导航app 稳定性问题总结

一 重写全局异常处理: 1 是过滤掉一些已知的无法处理的 问题,比如TimeoutException 这种无法根除只能缓解的问题可以直接catch掉 2 是 一些无法继续的问题可以直接杀死重启,一些影响不是很大的,可以局部还原 比如: p…

题记(23)--整除问题

目录 一、题目内容 二、输入描述 三、输出描述 四、输入输出示例 五、完整C语言代码 一、题目内容 给定n&#xff0c;a求最大的k&#xff0c;使n&#xff01;可以被a^k整除但不能被a^(k1)整除。 二、输入描述 两个整数n(2<n<1000)&#xff0c;a(2<a<1000) 三、…

实时流媒体传输开源库——Live555

Live555&#xff08;LiveMedia Libraries&#xff09;是一个开源的多媒体流处理库&#xff0c;主要用于实现基于标准网络协议的实时流媒体传输。Live555提供了一套 C 类库&#xff0c;可以用于开发支持 RTP/RTCP、RTSP、SIP 等协议的流媒体服务器和客户端应用程序。它广泛用于视…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

XXL-Job的搭建接入Springboot项目(详细)

一、XXL-Job介绍 XXL-Job 是一款开源的分布式任务调度平台&#xff0c;由 Xuxueli&#xff08;徐雪里&#xff09;开发。它基于 Java 技术栈&#xff0c;提供了一套简单易用、高可靠性的任务调度解决方案。 XXL-Job 的主要作用是帮助开发者实现定时任务的调度和执行。它可以用…

OpenCvSharp 通道拆分、空间转换

通道拆分、空间转换 通道拆分 //通道拆分&#xff08;BGR&#xff09; Mat[] BGR Cv2.Split(src); //通道合并 Mat dst new Mat(); Cv2.Merge(BGR, dst);空间转换 //BGR转灰度图 Mat dst new Mat(); Cv2.CvtColor(src, dst , ColorConversionCodes.BGR2GRAY); Cv2.ImShow…

MySQL 深度分页

文章目录 一、深度分页二、测试数据三、分页策略3.1 默认分页3.2 索引分页3.3 子查询3.4 延迟关联 一、深度分页 MySQL 深度分页是指在分页查询数据量比较大的表时&#xff0c;需要访问表中的某一段数据&#xff0c;而这段数据的位置非常靠后&#xff0c;需要通过较大的 offse…

2024年轻人返乡创业潮,外卖平台市场需求是怎么样的?

目前&#xff0c;县域经济正面临着几大利好。“返乡就业、返乡创业和告老还乡”现象越发普遍&#xff0c;这不仅在小县城中有所体现&#xff0c;同样在乡镇中也呈现出同样的趋势。一些产业链和工厂纷纷下沉到乡镇&#xff0c;带来了更多的就业机会。这不仅能够吸引年轻人回乡就…

Spring Boot 4.0:构建云原生Java应用的前沿工具

目录 前言 Spring Boot简介 Spring Boot 的新特性 1. 支持JDK 17 2. 集成云原生组件 3. 响应式编程支持 4. 更强大的安全性 5. 更简化的配置 Spring Boot 的应用场景 1. 云原生应用开发 2. 响应式应用程序 3. 安全性要求高的应用 4. JDK 17的应用 总结 作…

【Java万花筒】代码安全护航:Java自动化测试与BDD

自动化测试与行为驱动开发&#xff08;BDD&#xff09;库&#xff1a; 前言 在当今软件开发领域&#xff0c;自动化测试和行为驱动开发&#xff08;BDD&#xff09;已经成为确保软件质量和可维护性的不可或缺的一部分。Java开发者可以借助多种库和框架来实现自动化测试&#…

CRM系统--盘点五大CRM客户管理系统

在当今市场经济中&#xff0c;销售工作的重要性日益凸显&#xff0c;有效的客户管理成为了提升销售业绩的关键因素。面对日新月异的市场环境和客户需求的多样化&#xff0c;销售人员通常会面临以下问题&#xff1a; 接到了新的销售任务&#xff0c;该如何选择和确定目标客户&am…

什么是线程?线程和进程有什么区别?在Java中如何创建线程?你能解释一下Java中的synchronized关键字吗?

什么是线程&#xff1f;线程和进程有什么区别&#xff1f; 线程是操作系统进行运算调度的最小单位&#xff0c;它是进程中的实际运作单位。线程自己不拥有系统资源&#xff0c;只拥有一点在运行中必不可少的资源&#xff0c;但它可与同属一个进程的其它线程共享进程所拥有的全部…

API协议设计的十种技术

文章目录 前言一、REST二、GraphQL三、gRPC&#xff08;google Remote Procedure Calls&#xff09;四、Webhooks五、服务端的事件发送——SSE&#xff08;Server-sent Events&#xff09;六、EDI&#xff08;Electronic Data Interchange&#xff09;七、面向API 的事件驱动设…

Visual Studio2022实用使用技巧集

前言 对于.NET开发者而言Visual Studio是我们日常工作中比较常用的开发工具&#xff0c;掌握一些Visual Studio实用的搜索、查找、替换技巧可以帮助我们大大提高工作效率从而避免996。 Visual Studio更多实用技巧 https://github.com/YSGStudyHards/DotNetGuide 代码和功能搜…

Verilog基础:强度建模与net型信号的多驱动问题(三)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 四、一般情况下的net型信号的线与组合&#xff08;线网多驱动&#xff09; 在Verilog基础&#xff1a;强度建模与net型信号的多驱动问题&#xff08;二&#xff0…