路由以允许来自查询字符串和默认{id}模板的参数

时间:2018-08-11 07:47:18

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

我在ASP.Net Core WebAPI Controller中有一个操作,该操作采用一个参数。我正在尝试将其配置为能够以以下形式调用它:

public function profile(Request $request) {
    $user = $request->user();
    // do something

我似乎无法正确选择路由,因为我只能使一种形式被识别。 (简化的)动作签名如下所示:api/{controller}/{action}/{id} api/{controller}/{action}?id={id} 。这些是我尝试过的路线:

  • public ActionResult<string> Get(Guid id)-映射到[HttpGet("Get")]
  • api/MyController/Get?id=...-映射到[HttpGet("Get/{id}")]
  • 它们两者都-映射到api/MyController/Get/...

如何配置要使用这两种URL形式调用的操作?

2 个答案:

答案 0 :(得分:0)

将该参数设为可选

[Route("api/MyController")]
public class MyController: Controller {

    //GET api/MyController/Get
    //GET api/MyController/Get/{285A477F-22A7-4691-AA51-08247FB93F7E}
    //GET api/MyController/Get?id={285A477F-22A7-4691-AA51-08247FB93F7E}
    [HttpGet("Get/{id:guid?}"
    public ActionResult<string> Get(Guid? id) {

        if(id == null)
            return BadRequest();

        //...
    }    
}

但是,这意味着您需要对操作中的参数进行一些验证,以说明由于操作本身可以接受api/MyController/Get而可以将其作为null传递的事实。

引用Routing to controller actions in ASP.NET Core

答案 1 :(得分:0)

如果要使用路由模板 您可以在Startup.cs这样的配置方法中提供一个:

app.UseMvc(o =>
        {
            o.MapRoute("main", "{controller}/{action}/{id?}");
        });

现在您可以使用两个请求地址。

如果要使用属性路由,可以使用相同的方式:

[HttpGet("Get/{id?}")]
public async ValueTask<IActionResult> Get(
         Guid id)
    {

        return Ok(id);
    }