Vis*_*hal 4 odata asp.net-mvc-4 asp.net-web-api
根据OData Uri约定http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption,以下Uri有效。 http://services.odata.org/OData/OData.svc/Category(1)/Products?$ top = 2&$ orderby = name
但是,ASP.NET Web-API似乎不支持此功能(至少是开箱即用的)。它导致无法找到名为Category(1)的控制器的错误。
如何使它与Web-API一起使用还是可以解决的?
我不确定为什么当您提出问题时您的问题没有引起注意。但这是一个真正的问题。WebAPI支持很多OData规范,但据我所知并不是全部。虽然,我还没有找到确切描述哪些方面有效的资源。开箱即用的默认路由支持一层嵌套,而不像您的示例中那样支持两层嵌套。所以像:
mystuff.com/Category/5?$top2&orderby=name
Run Code Online (Sandbox Code Playgroud)
话虽如此,我认为您可以制作出自己想要的东西。我还没有编译/测试的这一切,所以忍耐一下....在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} );
Run Code Online (Sandbox Code Playgroud)
注意我注册路线的顺序-首先放置类别过滤器。这些路由的相应控制器看起来像:
public class ProductCategoryController : BaseAPIController {
public IEnumerable<Product> Products(int catID, int id) {
var result = new List<Product>();
//do category filtering here...
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,第一条路线将允许应用类别过滤器(catID)和可选的ProductID(id)。如果排除categoryID和括号,则第二条路线将生效。您需要两条路线,因为没有一种自动过滤掉括号的好方法。
附带一提,您可能会对我写的另一个答案感兴趣,该答案确定了您可能会遇到的其他路线体操。
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |