2012-05-15 57 views

回答

3

我不确定为什么你的问题没有得到关注,当你问它..但这是一个真正的问题。 WebAPI支持大量的OData规范,但并非全部都符合我的理解。虽然,我还没有找到一个资源来描述哪些方面的工作。开箱即用的默认路由支持一层嵌套,而不是像你的例子中那样。所以像这样:

mystuff.com/Category/5?$top2&orderby=name 

有了这说,我认为你可以制作你想要的东西。我还没有编译/测试的这一切,让我承受....在global.asax设置一对路由,就像这样:

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

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

注意顺序我注册的routes-- 放类别筛选器第一个。这些路线相应的控制器会看起来像:

public class ProductCategoryController : BaseAPIController { 
    public IEnumerable<Product> Products(int catID, int id) { 
     var result = new List<Product>(); 

     //do category filtering here... 

      return result; 
    } 
} 

所以第一条路线将允许类别过滤器(catID)和一个可选的ProductID(id)的应用。当排除类别ID &括号时,第二条路线将被捕获。您需要两条路线,因为没有很好的方法可以自动过滤括号。

作为便笺,您可能对another answer I wrote感兴趣,它可能会标识出您可能会遇到的其他路线体操。

+0

这就是我以前试过的,但没有奏效。这是api/{controller}({resourceId})/ {action}转换为api/Category(1)/ products,并且引发错误消息“找不到与名为'Category(1)'的控制器匹配的类型 – Vishal

+0

回答稍微靠近一点,我尝试了上面的方法,它对我很有用,你需要一对路线,一个在提供类别(包括括号)时工作,一个在没有提供时提供。订单我注册了路线,我怀疑你的是另一种方式 – EBarr

+0

是的,我改变了路线的顺序后可以开始工作,非常感谢! – Vishal