在网页API ID参数后,用行动路由(Routing with action after id pa

2019-09-04 02:50发布

在网页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<Event> GetEventsByDays(int idLocation, int days) {
        // do stuff
    }

    // GET api/locations/123?state=md
    public IEnumerable<Location> GetLocationsByState(string state) {
        // do stuff
    }
}

这里有真正的两个问题:

  1. 是否有意义有LocationsController返回事件或应该有应该是一个完全独立的控制器?
  2. 在路线会如何WebApiConfig被设置为允许这样的路线?

Answer 1:

你说的是大约两分型动物的事情:

路由

路由在ASP.NET MVC&网络API用于直接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。

调节器

它建议报告有每个控制器一个单一的责任心,并保持尽可能小。 你的业务逻辑应该在别处。

杰弗里·巴勒莫(洋葱架构的创建者)说

如果你不能在屏幕上看到一个ASP.NET MVC的操作方法,而无需滚动,你有问题

最后,因为你的一切,你可以做你想做的,而不注意,如果它是好还是坏。 难度不总是设置一个架构,但维护和遵守自己的规则。

我希望这能帮到您。 我想你是不是路由,以便familliar,所以不要犹豫,阅读介绍和操作选择 。



Answer 2:

您可以为事件单独的控制器,如果你想操纵位置无关的事件。 请看看这是帮助。



文章来源: Routing with action after id parameter in Web API