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

时间:2016-10-06 14:24:44

标签: asp.net-core-1.0 asp.net-routing

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

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

2 个答案:

答案 0 :(得分:2)

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

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

以下代码可以正常工作,并返回["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" };
    }
}

这也可以正常工作,在这种情况下返回路由参数中的指定值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个动作组合在同一个控制器中,它将返回500,因为有2种方法可以响应你的请求。

答案 1 :(得分:1)

您可以使用与此类似的方式使用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)
    {
    }
}