在Web API中的id参数之后使用操作进行路由
在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
/api/locations/123?state=md
控制器:
public class LocationsController : ApiController { // GET api/locations/123/events?days=5 public IEnumerable GetEventsByDays(int idLocation, int days) { // do stuff } // GET api/locations/123?state=md public IEnumerable GetLocationsByState(string state) { // do stuff } }
这里真的有两个问题:
- 有一个返回事件的
LocationsController
或者是否应该有一个完全独立的控制器是否有意义? - 如何设置
WebApiConfig
的路由以允许这样的路由?
你在谈论两件不同的事情:
路由
在ASP.NET MVC和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操作方法而不必滚动,则会出现问题
最后,就像你的一切一样,你可以做你想做的事情而不用关注它是好还是坏。 困难并不总是建立一个架构,而是维护和遵循自己的规则。
我希望这能帮到您。 我想你不是那么熟悉路由,所以不要犹豫,阅读介绍和动作选择 。
如果您想要独立于位置操作事件,则可以为事件设置单独的控制器。 请查看这是否有帮助。