ASP.NET Core 中实现自定义路由约束
admin
2022-02-28ASP.NET Core 中实现自定义路由约束
导航:
在此视频中,我们将讨论在ASP.NET Core中创建自定义路由约束。
我们在之前的视频中讨论了内置路由约束。如果这些内置路由约束不满足您的应用程序要求,则可以创建自定义路由约束。
在ASP.NET Core中创建自定义路由约束
要创建自定义路由约束实现IRouteConstraint接口,此接口在Microsoft.AspNetCore.Http命名空间中。
IRouteConstraint接口只有一种方法Match()
,继承后必须为其提供实现。如果满足约束,则此方法返回true,否则返回false。
public interface IRouteConstraint : IParameterPolicy
{
bool Match(HttpContext httpContext, IRouter route, string routeKey,RouteValueDictionary values, RouteDirection routeDirection);
}
IRouteConstraint Match()方法参数
参数 | 说明 |
---|---|
httpContext | 包含有关HTTP请求的信息 |
route | 该约束所属的路由 |
routeKey | 包含route参数的名称 |
values | 包含route参数值的字典 |
routeDirection | 它是一个对象,告知ASP.NET Core 路由是否从HTTP请求中处理url或者生成url。 |
自定义路由约束实现
假设在我们的项目中,我们只希望允许偶数作为有效的学生ID值。
目前内置的路由约束均无法满足业务需求,所以无法强制执行此操作。 所以只能通过创建自定义约束的形式来实现它。
以下自定义EvenConstraint
路由约束,判断学生Id是否为偶数,如果是则返回true,如果学生id值否则为false。
public class EvenConstraint : IRouteConstraint
{
public bool Match(HttpContext httpContext, IRouter route, string routeKey,
RouteValueDictionary values, RouteDirection routeDirection)
{
int id;
if (Int32.TryParse(values["id"].ToString(), out id))
{
if (id % 2 == 0)
{
return true;
}
}
return false;
}
}
注册自定义约束
要使用自定义路由约束,必须将其注册到我们应用程序的ConstraintMap字典中。我们在Startup类的ConfigureServices()方法中执行此操作。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<RouteOptions>(options =>
{
options.ConstraintMap.Add("even", typeof(EvenConstraint));
});
}
使用自定义路由约束
一旦注册了自定义路由约束,就可以像使用任何内置路由约束一样使用它。
@page "students/view/{id:even}"