ASP.NET MVC路由是否有区分int和字符串的方法

本文关键字:int 字符串 方法 MVC NET 路由 是否 ASP | 更新日期: 2023-09-27 17:59:17

假设我有两个类似的控制器操作

[Route("foo/bar/{id}")]
IHttpActionResult SomeController ( string id )
{
    // ... 
}
[Route("foo/bar/{id}")]
IHttpActionResult SameRouteAsAbove ( int id ) 
{
   // ... 
}

并且我向URL "foo/bar/123"发出请求。IIS或其他任何东西是否将其视为命中SameRouteAsAbove,因为该参数类似于数字,即使它可以作为数字的字符串表示?

ASP.NET MVC路由是否有区分int和字符串的方法

是的,您可以使用正则表达式,并修改您想要的方式。

仅供参考: 您需要测试所有可能的场景。否则,如果两个路由都匹配给定的id,则会出现运行时错误。

public class ValuesController : ApiController
{
    // GET api/values/1
    [Route("api/values/{id:int}")]
    public IHttpActionResult GetInteger(int id)
    {
        return Ok(id);
    }
    // GET api/values/abc
    [Route("api/values/{id:regex([a-zA-Z])}")]
     public IHttpActionResult GetString(string id)
    {
        return Ok(id);
    }
}

不,当您发出请求说"foo/bar/123"时,它确实是请求查询字符串的一部分,因此是string,但它是您的MVC Model Binder,它将负责将id值正确映射到您的操作方法参数类型,因此它将根据您定义的类型进行映射。

根据您发布的代码,除非您单独指定路线,否则这将是模糊的。你也可以更进一步,像一样定义你的Route

[Route("foo/bar/{id:int}")]
IHttpActionResult SameRouteAsAbove ( int id ) 
{
   // ... 
}