详解如安在ASP.NET Core中利用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() 要领,如下代码所示:

:11277
:11277/home
: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 要领。

: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 要领即可,如下代码所示:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdxwd.html