【问题标题】:Parameter Binding (string to int) in Web API Core 3.1Web API Core 3.1 中的参数绑定(字符串到整数)
【发布时间】:2020-02-26 06:38:13
【问题描述】:

我的控制器中有两个 GET 方法。

[HttpGet("{userId:int}", Name= nameof(GetUserById))]
GetUserById 

[HttpGet("{name:alpha}", Name=nameof(GetUserByName))]
GetUserByName

很遗憾,存在一个名为“007”的用户。当我调用http://api/Users/007 时,将调用第一个方法,因为系统将其视为值为 7 的整数。

任何可能的方法将请求定向到第二种方法,而不将其作为查询参数?

【问题讨论】:

    标签: rest asp.net-core-3.1 webapi


    【解决方案1】:

    我调用http://api/Users/007,第一个方法被调用,因为系统将其视为值为 7 的整数。

    由于路由限制,指定的 URL 与 GetUserByName 路由不匹配。 alpha 约束只接受字母,不接受数字。您必须将约束更改为限制较少的参数,以接受参数中的数字或完全删除约束。见:Route constraint reference

    区分这两者最可靠的方法是使用不同的模板:

    [HttpGet("{userId:int}", Name= nameof(GetUserById))] // leave it as is
    GetUserById
    
    <...>
    [HttpGet("name/{name}", Name=nameof(GetUserByName))] // add segment to route
    GetUserByName
    

    ASP.NET 路由器不知道仅仅因为有这样的用户就应该将“007”视为字符串。您应该更具体地表达您的意图,如果参数值可以匹配多个端点,则制作不同的端点路由。因此,路由器会将请求路由到正确的操作,而不是尝试找到可能不是您的最佳匹配的最佳匹配。

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2017-11-20
      • 2020-11-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多