首页 > 编程语言 >如何在 ASP.NET Core 中使用 Route 特性

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

时间:2023-12-19 14:33:07浏览次数:40  
标签:Core ASP int Route public Controller Action id

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 打上标记之后,http://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://zhuanlan.zhihu.com/p/346414408
https://www.infoworld.com/article/3569369/how-to-use-attribute-routing-in-aspnet-core.html

标签:Core,ASP,int,Route,public,Controller,Action,id
From: https://www.cnblogs.com/Yan3399/p/17913670.html

相关文章

  • 【ASP】读取数据库并显示字段的值例子
    1、不循环的例子,只有一条记录<% SetRs=Server.Createobject("Adodb.Recordset") sql="selecttop1*fromRc_SFZtmkg" Rs.opensql,conn,1,1 sfzDay=rs("tmbj")'把字段值赋值给变量 Rs.Close SetRs=Nothing%>显示 <td><%=Rs("t......
  • 简便实用:在 ASP.NET Core 中实现 PDF 的加载与显示
    前言在Web应用开发中,经常需要实现PDF文件的加载和显示功能。本文小编将为您介绍如何在ASP.NETCore中实现这一功能,以便用户可以在Web应用中查看和浏览PDF文件。实现步骤1)在服务器端创建PDF打开VisualStudio并创建新的ASP.NETCoreWeb应用程序,小编这里项目名称为Create......
  • vue3中router配置中的children怎么用
    在Vue3中,当你使用VueRouter创建路由配置时,children属性允许你为某个路由定义嵌套路由。这意味着你可以在父路由下设置子路由,从而构建出具有层级结构的URL路径。这里是一个基本的例子,展示了如何在VueRouter中使用children属性:import{createRouter,createWebHistory}from......
  • 符号执行manticore工具演练之发现缓冲区溢出漏洞
    符号执行之manticore工具演练参考资料:SANSSEC554https://docs.soliditylang.org/en/v0.8.0/ziion虚拟机:区块链智能合约中的kali(ziion涵盖演练中所以提及到的工具)动静态之分IDA是静态分析工具,常用于检测脆弱性;manticore是动态分析工具,常用于编写漏洞利用(符号执行:即执......
  • FRR(fast reroute)
    FRR(FastReroute,快速重路由)旨在当网络中链路或者节点失效后,为这些重要的节点或链路提供备份保护,实现快速重路由,减少链路或节点失效时对流量的影响,使流量实现快速恢复。1、核心知识1、为重要节点或链路提供备份保护2、核心节点配置1)ospf100FRRloop-free-alternate2、核心设备配置<......
  • 自定义元素宽高比例(aspect-ratio)与 @supports兼容支持和图片裁剪(object-fit)的用法
    1、aspect-ratio宽高比例属性aspect-ratio:1/1;aspect-ratio:16/9;aspect-ratio:0.5;//等同于1/2如下效果将为每个box子元素设置aspect-ratio:3/2,如下图所示: 2、object-fit图片裁剪object-fit:contain;保持宽高比,缩放保持图片完整性。object-fit:cover......
  • #yyds干货盘点#在 React Router 中使用 JWT
    创建一个React项目使用下方的指令会为我们创建一个项目$npmcreatevite@latestreact-jwt-cn然后我们选择 react 和 javascript 作为我们的框架和语言。在项目开始之前,我们要确保所有的依赖都已经被安装,所以我们要先执行$npminstall安装完毕后,在项目的根目录下,我们可以运......
  • ASP.NET WEBAPI 接入微信公众平台总结,Token验证失败解决办法
    首先,请允许我说一句:shit!因为这个问题不难,但是网上有关ASP.NETWEBAPI的资料太少。都是PHP等等的。我也是在看了某位大神的博客后有启发,一点点研究出来的。来看正题!1.微信公众平台的接入方法,无非4个参数(signature,timestamp,nonce,echostr)加1个Token(两边对应)2.Token,timestamp,......
  • Istio从入门到精通—— 流量治理的原理 —— VirutalService —— RouteDestination
     流量治理的原理——VirutalService——RouteDestinationhttps://istio.io/latest/docs/reference/config/networking/virtual-service/#RouteDestinationL4routingruleweighteddestination.L4路由规则的加权目的地。FieldType......
  • 关于`.Net Core`捕捉`C/C++`中的异常
    结论开门见山的说,.NetCore无法捕捉在C/C++编写的Dll中的方法的异常和错误。说明在.NetFramework框架期间,可以通过为方法增加特性:HandleProcessCorruptedStateExceptionsAttribute,或者使用RuntimeWrapperException捕捉运行时的错误,但是在.NetCore框架中,上述特性已经不再生......