• 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) },
        };
    }
    
  • 相关阅读:
    双端口SRAM中读干扰问题
    工业计算内存模块专用MRAM存储器-MR4A16B
    Java学习日报7.26
    Java学习日报7.25
    Java学习日报7.24
    Java学习日报7.23
    Java学习日报7.22
    Java学习日报7.21
    Java学习日报7.20
    Java学习日报7.19
  • 原文地址:https://www.cnblogs.com/irocker/p/inline-route-constraints-in-asp-net-core-mvc.html
Copyright © 2020-2023  润新知