创建自定义路由约束需实现IRouteConstraint接口,注册到ConstraintMap,并在路由模板中使用,如{param:even},以精确控制匹配逻辑,常见于格式校验场景。

在 ASP.NET Core 中创建自定义路由约束,可以让你更精确地控制 URL 路由匹配逻辑。比如你希望某个路由参数必须是有效的邮政编码、手机号或特定格式的字符串,就可以通过自定义约束实现。
1. 创建自定义路由约束类
自定义路由约束需要实现 IRouteConstraint 接口。该接口只有一个方法 Match,用于判断参数是否符合规则。
例如,创建一个检查参数是否为偶数的约束:
public class EvenNumberConstraint : IRouteConstraint{
public bool Match(
HttpContext httpContext,
IRouter route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
{
if (values.TryGetValue(routeKey, out var value))
{
var parameter = value?.ToString();
if (int.TryParse(parameter, out int number))
{
return number % 2 == 0;
}
}
return false;
}
}
2. 注册自定义约束
在 Program.cs 或 Startup.cs 中注册这个约束,使其可以在路由模板中使用。
在 Program.cs 的服务配置中添加:
builder.Services.AddSingleton// 或者更推荐的方式:注册为具名约束 builder.Services.Configure
3. 在路由中使用自定义约束
注册后,你可以在控制器路由或 Razor Pages 中使用这个约束。
例如,在控制器中:
[Route("api/values/{id:even}")] public IActionResult GetById(int id) { return Ok(new { Id = id }); }这样,只有当 id 是偶数时,该路由才会匹配。例如:
- /api/values/4 → 匹配
- /api/values/3 → 404
也可以用在 MapControllerRoute 或 MapGet 等终结点配置中:
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id:even?}");常见应用场景
自定义约束适合以下场景:
- 验证参数是否为 GUID
- 检查是否是手机号、邮箱、邮政编码等格式
- 限制值在某个枚举范围内(如 {action:in(create,edit,delete)})
- 日期格式校验
基本上就这些。只要实现接口、注册、并在路由中使用,就能灵活控制路由匹配行为。不复杂但容易忽略的是注册步骤——别忘了加到 ConstraintMap 里。











