温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在ASP.NET Core中自定义路由约束

发布时间:2021-05-24 17:58:30 来源:亿速云 阅读:173 作者:Leah 栏目:开发技术

本篇文章给大家分享的是有关怎么在ASP.NET Core中自定义路由约束,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

路由约束

ASP.NET Core中,通过定义路由模板,可以在Url上传递变量,同时可以针对变量提供默认值、可选和约束。

约束的使用方法是在属性路由上添加指定的约束名,用法如下:

// 单个使用
[Route("users/{id:int}")]
public User GetUserById(int id) { }
// 组合使用
[Route("users/{id:int:min(1)}")]
public User GetUserById(int id) { }

框架内部已经提供了一些约束,如下所示:

约束示例匹配项示例说明
int{id:int}123456789, -123456789匹配任何整数
bool{active:bool}true, FALSE匹配 true或 false(区分大小写)
datetime{dob:datetime}2016-12-31, 2016-12-31 7:32pm匹配有效的 DateTime 值(位于固定区域性中 - 查看警告)
decimal{price:decimal}49.99, -1,000.01匹配有效的 decimal 值(位于固定区域性中 - 查看警告)
double{weight:double}1.234, -1,001.01e8匹配有效的 double 值(位于固定区域性中 - 查看警告)
float{weight:float}1.234, -1,001.01e8匹配有效的 float 值(位于固定区域性中 - 查看警告)
guid{id:guid}CD2C1638-1638-72D5-1638-DEADBEEF1638, {CD2C1638-1638-72D5-1638-DEADBEEF1638}匹配有效的 Guid 值
long{ticks:long}123456789, -123456789匹配有效的 long 值
minlength(value){username:minlength(4)}Rick字符串必须至少为 4 个字符
maxlength(value){filename:maxlength(8)}Richard字符串不得超过 8 个字符
length(length){filename:length(12)}somefile.txt字符串必须正好为 12 个字符
length(min,max){filename:length(8,16)}somefile.txt字符串必须至少为 8 个字符,且不得超过 16 个字符
min(value){age:min(18)}19整数值必须至少为 18
max(value){age:max(120)}91整数值不得超过 120
range(min,max){age:range(18,120)}91整数值必须至少为 18,且不得超过 120
alpha{name:alpha}Rick字符串必须由一个或多个字母字符(a-z,区分大小写)组成
regex(expression){ssn:regex(^\d{{3}}-\d{{2}}-\d{{4}}$)}123-45-6789字符串必须匹配正则表达式(参见有关定义正则表达式的提示)
required{name:required}Rick用于强制在 URL 生成过程中存在非参数值

内置的约束能够适用于大部分常见的应用场景,但是有时候我们还是需要去自定义我们想要的效果。

自定义路由约束

自定义约束是要实现 IRouteConstraint 接口,然后重载 Match 方法,该方法有四个参数。

第一个参数 httpContext 是当前请求的上下文

第二个参数 route 是当前约束所属的路由

第三个参数 routeKey 是当前检查的变量名,例如文章开头示例中的 id

第四个参数 values 是当前Url匹配的字典值,例如文章开头的示例的路由,如果Url是 users/1 ,那么就有一个字典,其 key = id , value = 1 。当然还有其他的变量的值,比如 controller , action 等。

第五个参数 routeDirection 是一个枚举值,代表是web请求的还是用 Url.Action 等方法生成Url。

举一个实例,我们想要定义一个约束,指定路由传过来的参数必须是指定的枚举值。

我们先定义一个枚举:

public enum BoolEnum
{
  True,
  False
}

然后定义约束:

public class EnumConstraint : IRouteConstraint
{
  private Type _enumType;

  public EnumConstraint(string enumTypeName)
  {
    _enumType = Type.GetType(enumTypeName);
  }

  public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
  {
    var value = values[routeKey];
    if (value == null)
    {
      return false;
    }

    if (Enum.TryParse(_enumType, value.ToString(), out object result))
    {
      if (Enum.IsDefined(_enumType, result))
      {
        return true;
      }
    }

    return false;
  }
}

在 Startup.cs 的 ConfigureServices 方法添加自定义约束:

services.Configure<RouteOptions>(options =>
{
  options.ConstraintMap.Add("enum", typeof(EnumConstraint));
});

在路由上使用约束:

( WebApplicationTest 是当前的 namespace )

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
  // GET: api/Test
  [HttpGet("{bool:enum(" + nameof(WebApplicationTest) + "." + nameof(BoolEnum) + ")}")]
  public string Get(BoolEnum @bool)
  {
    return "bool: " + @bool;
  }

  [HttpGet("{id:int:min(2)}", Name = "Get")]
  public string Get(int id)
  {
    return "id: " + id;
  }

  [HttpGet("{name}")]
  public string Get(string name)
  {
    return "name: " + name;
  }
}

{id:int:min(2)} 路由必须使用 min(2) ,否则对于 id = 0 或 id = 1 会有冲突。

运行程序,当路由是 api/Test/0 、 api/Test/1 、 api/Test/True 和 api/Test/False 的时候,匹配我们的自定义约束。

当路由是 api/Test/{大于2的整数} 的时候,匹配第二个路由。

其他情况匹配第三个路由。

ASP.NET 是什么

ASP.NET 是开源,跨平台,高性能,轻量级的 Web 应用构建框架,常用于通过 HTML、CSS、JavaScript 以及服务器脚本来构建网页和网站。

以上就是怎么在ASP.NET Core中自定义路由约束,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI