返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >详解如何在ASP.NET Core中使用Route特性
  • 451
分享到

详解如何在ASP.NET Core中使用Route特性

ASP.NETnetroutecoreASP 2022-06-07 22:06:40 451人浏览 八月长安
摘要

 ASP.net core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上,Route 分两种:基于约定 和 基本特性 模式

 ASP.net core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上,Route 分两种:基于约定 和 基本特性 模式。

基于约定 模式的Route采用集中化的方式,而 基于特性 的方式允许你在 Action 或者 Controller 上单独定义,到底采用哪一种可以基于你自己的应用场景,本篇就来讨论如何使用 基于特性 模式。

创建 Controller 类

创建一个 DefaultController 类,新增如下代码。


 public class DefaultController : Controller
 {
  [Route("")]
  [Route("Default")]
  [Route("Default/Index")]
  public ActionResult Index()
  {
   return new EmptyResult();
  }
  [Route("Default/GetRecordsById/{id}")]
  public ActionResult GetRecordsById(int id)
  {
   string str = string.FORMat
   ("The id passed as parameter is: {0}", id);
   return Ok(str);
  }
 }
Controller 级别定义 Route 特性

Route特性可用于 Controller 和 Action 级别,值得注意的是,如果应到到前者,那么 Controller 下的所有 Action 都受这个 Route 管控。

如果你仔细观察上面的 DefaultController 类代码,你会发现两个 Action 方法的 Route 路径都有 Default 前缀,这就不优雅了,优化方式就是把 Route 路径中的 Default 提取到 Controller 级别,代码如下:


[Route("Default")] 
public class DefaultController : Controller
{
 [Route("")]
 [Route("Index")]
 public ActionResult Index()
 {
  return new EmptyResult();
 }
 [HttpGet]
 [Route("GetRecordsById/{id}")]
 public ActionResult GetRecordsById(int id)
 {
  string str = string.Format("The id passed as parameter is: {0}", id);
  return Ok(str);
 }
}

可以看出当 Controller 和 Action 级别都被 Route 打上标记之后,Asp.net core 中的 Route 引擎会自动将两者拼接起来,当然更简单粗暴的做法就是在 Controller 上使用 RoutePrefix 特性,如下代码所示:


[RoutePrefix("services")]
public class HomeController : Controller
{
 //Action methods
}
Action 级别定义 Route 特性

参考刚才的 DefaultController 类,我在 Index 方法上面定义了三个 Route 特性,这就意味着下面三种 Route 都可以访问到 Index() 方法,如下代码所示:

http://localhost:11277
http://localhost:11277/home
http://localhost:11277/home/index

常常在 基于约定 模式的Route中,它的 Route template 会有一些对参数的约定,比如下面的代码:


   app.UseEndpoints(endpoints =>
   {
    endpoints.MapControllerRoute(
     name: "default",
     pattern: "{controller=Home}/{action=Index}/{id?}");
   });

同样 基于特性 模式的 Route 也是可以使用参数模式的,比如文章之前的 DefaultController.GetRecordsById 就是的,值得注意的是模板中的 {id} 表示可接收任何参数,如 string,int 等等,如果你想限定为 int 的话,也是可以实现的。

使用 Route 约束

Route 约束 就是 Controller 前的一个防火墙,他会踢掉一些不合规范的 Action 请求,比如说:你要求某个 Action 接收的参数必须是 int,那在 Route 模板中定义的语法格式一定是这样的 {parameter:constraint},如下代码所示:


[Route("Default/GetRecordsById/{id:int}")]
public ActionResult GetRecordsById(int id)
{
 string str = string.Format("The id passed as parameter is: {0}", id);
 return Ok(str);
}
在 Route 中使用可选参数

你也可以在 Route Template 上指定可选参数,意味着这个参数可传可不传,格式如下:


[Route("Sales/GetSalesByRegionId/{id?}")]

有一点非常重要,当你使用了 Route特性 之后,其实 Controller 或者 Action 的名字就不再重要了,因为 Route处理引擎 已经不再将其作为参考选项,下面的代码片段展示了如何在 Action 方法上变更 Route template 格式。


[Route("Home/GetRecordsById/{id:int}")]
public ActionResult GetRecordsById(int id)
{
 string str = string.Format("The id passed as parameter is: {0}", id);
 return Ok(str);
}

接下来可以直接使用如下地址访问 GetRecordsById 方法。

http://localhost:11277/home/GetRecordsById/1

对 Action 中的参数使用多个约束

真实场景中你不仅要求 id 必须是整数,还要求必须有一定意义,比如说最小值为1,对这种有 多重约束 的需求如何去实现呢? 请看下面代码。


[Route("Default/GetRecordsById/{id:int:min(1)}")]
public ActionResult GetRecordsById(int id)
{
 string str = string.Format("The id passed as parameter is: {0}", id);
 return Ok(str);
}
常使用的 Route 约束
int 限定为 int 类型 max/min 限定 int 的最大数和最小数 minlength 限定 string 的最小长度 regex 限定符合的正则
创建自定义的 Route 约束

如果上面的一些约束不满足你的要求,你完全可以为你的场景深度定制,做法就是使用 IRouteConstraint 接口并实现它的 Match 方法即可,如下代码所示:


 public class CustomRouteConstraint : IRouteConstraint
 {
  public bool Match(HttpContext httpContext, IRouter route,
  string routeKey,
  RouteValueDictionary values, RouteDirection routeDirection)
  {
   throw new NotImplementedException();
  }
 }
在 Controller 上使用 token 占位符

所谓的 token 占位符 就是具有一些特定含义的占位符号,比如说:[action], [area] 和 [controller],分别表示用你真实的 Controller 和 Action 去替换,下面的代码展示了如何使用这种模式去实现。


[Route("[controller]/[action]")]
public class HomeController : Controller
{
 private readonly ILogger<HomeController> _logger;
 public HomeController(ILogger<HomeController> logger)
 {
  _logger = logger;
 }
 public IActionResult Index()
 {
  return View();
 }
 //Other action methods
}

整体来看,基于特性 的 Route 给了你更多的操控权限,灵活的 Route Template 配置实现了 Controller 和 Action 的解耦,当然这里也不是说 基于约定 的Route 不好,毕竟人家是 Global 级别的,真实场景下两者更多的是混着用。

译文链接:https://www.infoworld.com/article/3569369/how-to-use-attribute-routing-in-aspnet-core.html

到此这篇关于如何在ASP.Net Core中使用Route特性的文章就介绍到这了,更多相关asp.net Core Route特性内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文章:win10下ASP.net Core部署环境搭建步骤详解ASP.NET Core Token认证ASP.NET Core文件上传与下载实例(多种上传方式)ASP.NET Core 导入导出excel xlsx 文件实例ASP.NET Core Razor 页面路由详解ASP.NET Core环境变量和启动设置的配置教程Visual Studio 2017 ASP.NET Core开发如何在ASP.NET Core应用程序运行Vue并且部署在IIS上详解


--结束END--

本文标题: 详解如何在ASP.NET Core中使用Route特性

本文链接: https://lsjlt.com/news/30792.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解如何在ASP.NET Core中使用Route特性
     ASP.NET Core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上,Route 分两种:基于约定 和 基本特性 模式...
    99+
    2022-06-07
    ASP.NET net route core ASP
  • 如何在ASP.NET Core中使用HttpClientFactory
    目录为什么要使用 HttpClientFactory 使用 HttpClientFactory 注入 Controller ASP.Net Core 是一个开源的,跨平台的,轻量级模...
    99+
    2024-04-02
  • 如何在ASP.NET Core中使用ViewComponent
    目录前言自定义一个组件ViewComponent特性Taghelper方式Reference前言 在之前的开发过程中,我们对于应用或者说使用一些小的组件,通常使用分布页(parti...
    99+
    2024-04-02
  • 如何在ASP.Net Core中使用Serilog
    目录安装 Serilog使用 Serilog Sink使用 Serilog 替换原生的 Logger记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志...
    99+
    2024-04-02
  • Serilog如何在ASP.Net Core中使用
    本篇文章为大家展示了Serilog如何在ASP.Net Core中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。安装 Serilog使用 Visual Studio 新建 ASP.Net Cor...
    99+
    2023-06-14
  • 如何在Asp.Net Core中使用Refit
    本篇文章给大家分享的是有关如何在Asp.Net Core中使用Refit,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ASP.NET 是什么ASP.NET 是开源,跨平台,高性...
    99+
    2023-06-07
  • ASP.NET中Route组件如何使用
    这篇文章将为大家详细讲解有关ASP.NET中Route组件如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。RouteBase职责明确:从请求中获取数据,及根据数据生成虚拟路径。它只有两...
    99+
    2023-06-17
  • ASP.NET Core中HttpContext详解与使用
    “传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Co...
    99+
    2024-04-02
  • ASP.NET Core 中FromServices如何使用
    本篇文章给大家分享的是有关 ASP.NET Core 中FromServices如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。构造函数...
    99+
    2024-04-02
  • 详解如何在ASP.Net Core中实现健康检查
    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态。 ASP.Net Cor...
    99+
    2024-04-02
  • 如何在ASP.Net Core应用程序中使用Bootstrap4
    本篇内容介绍了“如何在ASP.Net Core应用程序中使用Bootstrap4”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!笔者...
    99+
    2023-06-26
  • ASP.NET Core中间件如何使用
    今天小编给大家分享一下ASP.NET Core中间件如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言...
    99+
    2023-06-29
  • 在 ASP.NET Core 中使用 HTTP 标头传播详情
    目录前言Demo结论前言 我们常用 JWT 令牌用于身份验证,前端一般是在请求中包含 HTTP 标头 Authorization 实现。 但是,当服务间需要互相调...
    99+
    2024-04-02
  • 怎样在ASP.NET Core中使用HttpClientFactory
    本篇内容主要讲解“怎样在ASP.NET Core中使用HttpClientFactory”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎样在ASP.NET Core中使用HttpClientFa...
    99+
    2023-06-14
  • ASP.NET Core中如何实现重定向详解
    前言 ASP.NET Core 是一个跨平台,开源的,轻量级的,模块化的,用于构建高性能的 web 开发框架, ASP.NET Core MVC 内置了多种方式将一个 requ...
    99+
    2022-06-07
    重定向 ASP.NET net core ASP
  • 如何在ASP.NET Core中使用Session的示例代码
    ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且 高度模块化的web框架,Session 可以实现用户信息存储从而可以在同一个客户端的多次请求之间实现用户追...
    99+
    2022-06-07
    net ASP.NET 示例 core session ASP
  • asp.net core 中的Jwt(Json Web Token)的使用详解
    简单描述: session不支持 分布式 并且在服务器存储一份用户登录的信息,这份登录信息会在响应时传递给浏览器,告诉其保存为cookie,以便下次请求时发送给我们的应用 Jwt描述...
    99+
    2022-11-13
    asp.net core  Jwt使用 asp.net core Jwt
  • ASP.NET Core在WebApi项目中使用Cookie
    目录一、Cookie的作用二、在ASP.NET Core中使用Cookie1、在控制器中直接使用Cookie1.1、设置Cookie1.2、获取Cookie1.3、删除Cookie信...
    99+
    2024-04-02
  • ASP.NET Core在Task中使用IServiceProvider的问题解析
    目录前言问题演示解决问题问题探究请求中的IServiceProvider请求中的IServiceProvider和IServiceScopeFactory后续插曲总结前言 问题的起因...
    99+
    2022-11-13
    ASP.NET Core使用IServiceProvider ASP.NET Core Task使用IServiceProvider
  • 在ASP.Net Core应用程序中使用Bootstrap4
    笔者的前端文件如下 笔者增加Bootstrap 4 和 FontAwersome(字体图标),因为Bootsrap 4已经不再包含图标了。 ASp.Net Core 中,通常在&n...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作