在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
这里确实有两个问题:
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
}
}
返回事件或是否应该有一个完全独立的控制器是否有意义?LocationsController
中的路由以允许此类路由?答案 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操作方法而无需滚动,则表示存在问题
最后,就像你的一切一样,你可以做你想做的事,而不用关注它是好还是坏。困难并不总是建立一个架构,而是维护并遵循自己的规则。
我希望这会对你有所帮助。 我想你不是那么熟悉路由,所以不要犹豫,阅读intro和action selection。
答案 1 :(得分:0)
如果您想要独立于位置操纵事件,则可以为事件设置单独的控制器。请查看this是否有帮助。