Вопрос по c#-4.0, asp.net-mvc-4 – Как обрабатывать иерархические маршруты в ASP.NET Web API?

35

В настоящее время у меня есть два контроллера

1 - родительский контроллер

2 - Детский контроллер

Я получаю доступ к своему родительскому контроллеру вот так

someurl\parentcontroller

Теперь я хочу получить доступ к своему контроллеру детей, как это

someurl\parentcontroller\1\childcontroller

Этот последний URL должен возвращать всех детей определенного родителя.

У меня есть этот маршрут в настоящее время в моем файле global.asax

routes.MapHttpRoute ("Route1", "{controller}/{id}", new { id = RouteParameter.Optional });

Я не уверен, как мне достичьparent\id\child иерархия .. Как мне настроить мои маршруты для достижения этого? Идеи?

Это похоже на дубликатstackoverflow.com/questions/9594671/… mo.

Ваш Ответ

4   ответа
18

Начиная с Web API 2, теперь вы можете использовать атрибуты маршрутизации для определения собственной маршрутизации для каждого метода,

[Route("api/customers/{id:guid}/orders")]
public IEnumerable<Order> GetCustomerOrders(Guid id) {
   return new Order[0];
}

Вам также необходимо добавить следующую строку в метод инициализации WebApiConfig.Register (),

  config.MapHttpAttributeRoutes();

Полная статья, http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

5

Помимо использования маршрутизации mvc по умолчанию, вы можете посмотреть на Attribute Routing -https://github.com/mccalltd/AttributeRouting, Хотя это больше работы, декорирование отдельных методов действий обеспечивает массу гибкости, когда вам нужно разработать сложные маршруты. Вы также можете использовать его в сочетании со стандартной маршрутизацией MVC.

10

Я хотел справиться с этим в более общем смысле, вместо того, чтобы подключать ChildController напрямую кcontroller = "Child"как Абхиджит Кадам. У меня есть несколько дочерних контроллеров, и я не хотел отображать конкретный маршрут для каждого сcontroller = "ChildX" а такжеcontroller = "ChildY" вновь и вновь.

мойWebApiConfig выглядит так:

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

Мои родительские контроллеры очень стандартны и соответствуют маршруту по умолчанию выше. Пример дочернего контроллера выглядит следующим образом:

public class CommentController : ApiController
{
    // GET api/product/5/comment
    public string Get(ParentController parentController, string parentId)
    {
        return "This is the comment controller with parent of "
        + parentId + ", which is a " + parentController.ToString();
    }
    // GET api/product/5/comment/122
    public string Get(ParentController parentController, string parentId,
        string id)
    {
        return "You are looking for comment " + id + " under parent "
            + parentId + ", which is a "
            + parentController.ToString();
    }
}
public enum ParentController
{
    Product
}

Some drawbacks of my implementation

  • As you can see, I used an enum, so I'm still having to manage parent controllers in two separate places. It could have just as easily been a string parameter, but I wanted to prevent api/crazy-non-existent-parent/5/comment/122 from working.
  • There's probably a way to use reflection or something to do this on the fly without managing it separetly, but this works for me for now.
  • It doesn't support children of children.

Возможно, существует лучшее решение, которое является еще более общим, но, как я уже сказал, это работает для меня.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededswitchError: User Rate Limit ExceededIHttpControllerSelectorError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
31

Настройте маршруты, как показано ниже. {Param} является необязательным (используйте, если вам нужно):

routes.MapHttpRoute(
           name: "childapi",
           routeTemplate: "api/Parent/{id}/Child/{param}",
           defaults: new { controller = "Child", param = RouteParameter.Optional }
  );

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

Затем назовите дочерний APi как / api / Parent / 1 / child Родитель может быть назван просто как / api / Parent /

Дочерний контроллер:

    public class ChildController : ApiController
    {     
        public string Get(int id)
        {
          //the id is id between parent/{id}/child  
          return "value";
        }
        .......
    }
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Haris Hasan
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Haris Hasan
Error: User Rate Limit Exceeded Haris Hasan

Похожие вопросы