ASP.NET Core 中实现自定义路由约束

admin
admin
2022-02-28
分享:

ASP.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}"