.Net核心API -查询字符串中的路由参数不起作用

5lwkijsr  于 2023-01-27  发布在  .NET
关注(0)|答案(3)|浏览(97)

我们正在将我们的Web API升级到.Net Core。该API是具有员工搜索和GET端点的员工API,如下所示:

GET /employees/{id}
GET /employees

对于Get端点,当前以下两个调用都有效:

https://example.com/employees/001
https://example.com/employees/{id}?id=001

将代码升级到.Net Core 6.0后,只有以下调用有效:

https://example.com/employees/001

查询字符串中具有id的另一个调用不起作用。是否有办法使这两个调用都在.Net Core中起作用

pu82cl6c

pu82cl6c1#

这就是你定义路由的全部方式,如果你把参数放在路由中,比如/employees/001,它会寻找那个路径来决定要访问哪个函数,比如我设置了2个路由来调用2个函数:

[Route("Stuff/{id}")]
    public IActionResult StuffWithIDInPath(int id)
    {
        ViewData["idVal"] = id;
        return View("SomeStuff");
    }

    [Route("Stuff")]
    public IActionResult StuffWithIDInQS(int id)
    {
        ViewData["idVal"] = id;
        return View("SomeStuff");
    }

第一条路线在我去某事/stuff/37时被击中

第二个函数在路由中没有这个参数,但它也是这个函数的一个参数,所以如果它出现了,它知道要查找它:

但是,也许您希望用一个函数来处理这两种情况,如果您为同一个函数正确定义了路由,就可以同时处理这两种情况。

[Route("Stuff/{id}")]
    [Route("Stuff")]
    public IActionResult StuffWithIDEitherPlace(int id)
    {
        ViewData["idVal"] = id;
        return View("SomeStuff");
    }

在这种情况下,任何一个URL都将转到该函数,处理路由中的参数或作为查询字符串。

x6h2sr28

x6h2sr282#

操作路由属性应将id作为可选参数

[HttpGet("~/employees/{id?}")]
    public IActionResult Get(int? id)

或者如果控制者是雇员

public class Employees : ApiController
..........
    [HttpGet("id?}")]
    public IActionResult Get(int? id)
tf7tbtn2

tf7tbtn23#

这是我最后合并我的.NET Framework Get()& Get(string lat,string lng)的方式。如果我从头开始创建这个,我不会这样做,但我有一个IOS应用程序,将需要得到更新后,我迁移我的API到.NET核心。

// Get All Restaurants OR Get By Latitude/Longitude
[HttpGet]
public async Task<ActionResult<IEnumerable<LocationListViewModel>>> Get(string lat = "", string lng = "")
{
    if (string.IsNullOrEmpty(lat) && string.IsNullOrEmpty(lng))
    {
        return await _locationService.GetRestaurantsAsync();
    }
    else
    {
        return await _locationService.GetRestaurantsByLatLngAsync(lat, lng);
    }
}

相关问题