多级ASP.NET路由



我正在尝试在ASP.NET核心中创建多个级别路由,例如:

  • api/cities
  • api/cities/{id}
  • api/cities/date/{date}

问题是,当我尝试使用比api/cities/{id}更长的时间时,我只得到404。

我的控制器:

[Route("api/[controller]")]
    public class CitiesController : Controller
    {
        private ICityRepository _repository;
        public CitiesController(ICityRepository repository)
        {
            _repository = repository;
        }
        // GET: api/cities
        [HttpGet]
        public IEnumerable<City> Get()
        {
            IEnumerable<City> results = _repository.GetCities();
            return results;
        }
        //api/cities/date/{date}
        [HttpGet]
        [Route("date/{date}")]
        public IEnumerable<City> Get2(string date)
        {
            return _repository.GetCitiesByDate(date);
        }
        // GET api/cities/5
        [HttpGet("{id: int}")]
        public string Get(int id)
        {
            return "value";
        }
    }

我需要做什么才能在此控制器下获得更长的路线才能工作?

编辑:

我在此处查看文档:https://www.asp.net/web-papi/web-api/web-api-routing-and-and-actions/attribute-routing-in-web-api-2

它说您可以有:

之类的路线
  • /orders/1
  • /订单/待处理
  • /orders/2013/06/16

并分别具有三个路线。但这似乎并没有提供有关您如何做到这一点的示例。

我可以看到路由的问题,因为您不能拥有"/"作为字符串的一部分。

尝试将日期传递为2013_06_16不是2013/06/16或更改拥有日期的路线/{年}/{月}/{day}

示例:

[Route("api/[controller]")]
public class CitiesController : Controller
{
    private ICityRepository _repository;
    public CitiesController(ICityRepository repository)
    {
        _repository = repository;
    }
    // GET: api/cities
    [HttpGet]
    public IEnumerable<City> Get()
    {
        IEnumerable<City> results = _repository.GetCities();
        return results;
    }
    //api/cities/date/2016/06/16
    [HttpGet]
    [Route("date/{year}/{month}/{day}")]
    public IEnumerable<City> Get2(string year,string month,string day)
    {
        string date = year + "/" + month + "/" + day;
        return _repository.GetCitiesByDate(date);
    }

    // GET api/cities/5
    [Route("{id: int}")]
    [HttpGet]
    public string Get(int id)
    {
        return "value";
    }
      //api/cities/pending
    [Route("{text}"]
    [HttpGet]
    public string Get(string text)
    {
        return "value";
    }
}

希望这个帮助。

最新更新