我可以为带参数的控制器添加路由吗?

Can I add route for controller with parameters?

我可以为控制器使用路由属性并且该属性有参数,而不仅仅是 ASP.NET Core 中的常量字符串吗? 前任。我想添加下面提到的定义控制器

 [Route("api/sth/{Id}/sth2/latest/sth3")]
 public class MyController : Controller
 {
    public object Get() 
    {
      return new object();
    }
 }

您可以以类似的方式使用 RoutePrefix,然后根据需要向每个方法添加 Route。在路由前缀中定义的参数仍然以与在方法的路由中指定它们相同的方式传递给方法。

例如,您可以这样做:

[RoutePrefix("api/sth/{id}/sth2/latest/sth3")]
public class MyController : ApiController
{
    /// <example>http://www.example.com/api/sth/12345/sth2/latest/sth3</example>
    [Route()]  // default route, int id is populated by the {id} argument
    public object Get(int id)
    {
    }

    /// <example>http://www.example.com/api/sth/12345/sth2/latest/sth3/summary</example>
    [HttpGet()]
    [Route("summary")]
    public object GetSummary(int id)
    {
    }

    /// <example>http://www.example.com/api/sth/12345/sth2/latest/sth3/98765</example>
    [HttpGet()]
    [Route("{linkWith}")]
    public object LinkWith(int id, int linkWith)
    {
    }
}

当然可以,但如果计划不周,这往往会很棘手。

假设您的 owin Startup class 设置为默认 WebApi 路由 app.UseMvc()

下面的代码工作正常并且 returns ["value1", "value2"] 独立于值 {id}

curl http://localhost:5000/api/values/135/foo/bar/

[Route("api/values/{id}/foo/bar")]
public partial class ValuesController : Controller
{
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

这也很好用,return在这种情况下在路由参数中指定值 135

curl http://localhost:5000/api/values/135/foo/bar/

[Route("api/values/{id}/foo/bar")]
public partial class ValuesController : Controller
{
    [HttpGet]
    public int GetById(int id)
    {
        return id;
    }
}

但是如果您将这 2 个操作组合在同一个控制器中,它将 return 500,因为有 2 个方法可以响应您的请求。