Inline Route Constraints in ASP.NET Core MVC

原文

ASP.NET MVC5和Web API2的一个新特性是attribute routing, 通过它我们可以使用[Route]来定义路由模板:

public class MessagesController : ApiController
{
    [Route("messages/{messageId}")]
    public Message Get(int messageId)
    {
        // ...
    }
}

还可以在此添加路由参数约束{parameterName:constraint}。在上面的例子中我们可以约束messageId参数为int类型:

public class MessagesController : ApiController
{
    [Route("messages/{messageId:int}")]
    public Message Get(int messageId)
    {
        // ...
    }
}

如果我们想添加另外一个拥有类型为guid的路由参数的action,可以使用guid路由约束。如果没有这个约束两个action就拥有同一个路由模板了:

public class MessagesController : ApiController
{
    [Route("messages/{messageId:int}")]
    public Message Get(int messageId)
    {
        // ...
    }
    
    [Route("messages/{messageId:guid}")]
    public Message Get(Guid messageId)
    {
        // ...
    }
}

intguid只是路由参数约束的其中之二,更多见Attribute Routing in ASP.NET Web API 2

内联路由约束在单独的路由文件中

在ASP.NET MVC5和Web API2中内联路由约束只支持[Route].

在单独的路由文件中不支持内联路由约束。在单独的路由文件中使用路由约束需要使用MapRouteMapHttpRoute方法的第四个参数:

routes.MapHttpRoute("Messages", "messages/{messageId}",
    new { controller = "Messages" }
    new { messageId = new IntRouteConstraint() });

幸运的是ASP.NET MVC Core支持内联路由约束。我们可以在Startup.cs文件中定义路由:

routes.MapRoute("Messages", "messages/{messageId:int}",
    new { controller = "Messages", action = "Get" });

我看了github上aspnet/Routing的源代码,在RouteOptions类中找到了下面的代码:

private static IDictionary<string, Type> GetDefaultConstraintMap()
{
    return new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase)
    {
        // 类型约束
        { "int", typeof(IntRouteConstraint) },
        { "bool", typeof(BoolRouteConstraint) },
        { "datetime", typeof(DateTimeRouteConstraint) },
        { "decimal", typeof(DecimalRouteConstraint) },
        { "double", typeof(DoubleRouteConstraint) },
        { "float", typeof(FloatRouteConstraint) },
        { "guid", typeof(GuidRouteConstraint) },
        { "long", typeof(LongRouteConstraint) },

        // 长度约束
        { "minlength", typeof(MinLengthRouteConstraint) },
        { "maxlength", typeof(MaxLengthRouteConstraint) },
        { "length", typeof(LengthRouteConstraint) },

        // 最小值/最大值约束
        { "min", typeof(MinRouteConstraint) },
        { "max", typeof(MaxRouteConstraint) },
        { "range", typeof(RangeRouteConstraint) },

        // 基于正则的约束
        { "alpha", typeof(AlphaRouteConstraint) },
        { "regex", typeof(RegexInlineRouteConstraint) },

        { "required", typeof(RequiredRouteConstraint) },
    };
}
原文地址:https://www.cnblogs.com/irocker/p/inline-route-constraints-in-asp-net-core-mvc.html