38

目前我有两个控制器

1 - 父控制器

2 - 子控制器

我像这样访问我的父控制器

someurl\parentcontroller

现在我想像这样访问我的孩子控制器

someurl\parentcontroller\1\childcontroller

最后一个 url 应该返回特定父级的所有子级。

我的 global.asax 文件中目前有这条路线

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

我不确定如何实现我的parent\id\child层次结构。我应该如何配置我的路线来实现这一点?想法?

4

4 回答 4

32

如下配置路由。{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";
        }
        .......
    }
于 2012-05-28T12:11:31.363 回答
19

从 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

于 2014-11-13T11:19:46.067 回答
10

我想以更通用的方式处理这个问题,而不是controller = "Child"像 Abhijit Kadam 那样直接用 连接 ChildController。我有几个子控制器,不想一遍又一遍地为每个子控制器映射特定的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
}

我的实现的一些缺点

  • 如您所见,我使用了enum,所以我仍然需要在两个不同的地方管理父控制器。它可以很容易地成为一个字符串参数,但我想阻止它api/crazy-non-existent-parent/5/comment/122工作。
  • 可能有一种方法可以使用反射或其他方法来即时执行此操作,而无需单独管理它,但这对我现在有用。
  • 它不支持孩子的孩子。

可能有一个更通用的更好的解决方案,但就像我说的,这对我有用。

于 2013-03-11T15:00:49.893 回答
5

除了使用默认 mvc 路由之外,还有一个选项是查看属性路由 - https://github.com/mccalltd/AttributeRouting。虽然它的工作量更大,但当您需要设计复杂的路线时,装饰单个动作方法提供了很大的灵活性。您还可以将它与标准 MVC 路由结合使用。

于 2012-05-28T23:09:54.933 回答