zoukankan      html  css  js  c++  java
  • 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) },
        };
    }
    
  • 相关阅读:
    【洛谷4941】War2 状压Dp
    洛谷4623 [COCI2012-2013#6] BUREK
    洛谷1099 [NOIP2007] 树网的核
    【Jim】I am back (ง •_•)ง
    发个ZKW线段树板子测试一下代码高亮
    洛谷2764 最小路径覆盖问题
    洛谷1972 [SDOI2009]HH的项链
    bzoj1059 [ZJOI2007]矩阵游戏
    知识点整理--组合数学
    最大矩形问题总结
  • 原文地址:https://www.cnblogs.com/irocker/p/inline-route-constraints-in-asp-net-core-mvc.html
Copyright © 2011-2022 走看看