在Web API中的id参数之后使用操作进行路由

时间:2013-05-17 17:22:56

标签: c# routing asp.net-web-api asp.net-web-api-routing

在web api中,默认路由是: /api/locations/123?days=5

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

但是,如果我希望路线看起来像/api/locations/123/events?days=5,同时仍然可以使用这样的路线点击LocationsController <{1}}

控制器:

/api/locations/123?state=md

这里确实有两个问题:

  1. public class LocationsController : ApiController { // GET api/locations/123/events?days=5 public IEnumerable<Event> GetEventsByDays(int idLocation, int days) { // do stuff } // GET api/locations/123?state=md public IEnumerable<Location> GetLocationsByState(string state) { // do stuff } } 返回事件或是否应该有一个完全独立的控制器是否有意义?
  2. 如何设置LocationsController中的路由以允许此类路由?

2 个答案:

答案 0 :(得分:1)

你在谈论两件不同的事情:

路由

路由用于ASP.NET MVC&amp; Web Api将URL直接映射到控制器和/或操作。这对于可读性特别有用,因为开发人员可以专注于设计人类可读的URL(例如,产品支持和搜索引擎索引)。这里重要的是路线和控制器之间没有唯一的关系。如果需要,您可以创建10个路径来映射相同的控制器/操作。

例如,您的两条路线可以是这样的

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
); 
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{idLocation}/events/{days}",
    defaults: new { id = RouteParameter.Optional }
); 

另请注意,/api/locations/123?state=md对于默认路由模板不正确。它是/api/locations/123。因为url中有一个额外的参数,所以你将执行GetLocationsByState。

控制器

建议每个控制器具有一个单一的责任,并尽可能地保持它。您的业​​务逻辑应该在其他地方。

  

Jeffrey Palermo(洋葱建筑的创造者)说

     

如果您无法在屏幕上看到ASP.NET MVC操作方法而无需滚动,则表示存在问题

最后,就像你的一切一样,你可以做你想做的事,而不用关注它是好还是坏。困难并不总是建立一个架构,而是维护并遵循自己的规则。

我希望这会对你有所帮助。 我想你不是那么熟悉路由,所以不要犹豫,阅读introaction selection

答案 1 :(得分:0)

如果您想要独立于位置操纵事件,则可以为事件设置单独的控制器。请查看this是否有帮助。