.net – WebApi OData实体集/密钥/导航/密钥支持
我正在研究在WebApi中使用odata.到目前为止这么好,我喜欢它比wcf数据服务更灵活.
但是当我尝试在模型中使用虚拟IQueryable属性时遇到问题. 所以例如我有这些模型类: public class MainItem { public int Id { get; set;} public virtual IEnumerable<SubItem> SubItems { get; set;} } 而我的MainItemsController看起来像这样 public class MainItemsController : EntitySetController<MainItem,int> { [Queryable] public override IQueryable<MainItem> Get() { return SomeMainItemIQueryable(); } public override GetEntityByKey(int key) { return SingleMainItem(key); } [Queryable] public IQueryable GetSubItems(int key) { return SomeSubItemIQueryable(SingleMainItem(key)); } } 我在以下网址上得到了正确的结果: 但是当我尝试做的时候 我收到这个错误 我很乐意将此调用以及/ odata / MainItems(1)/ SubItems重定向到SubItemsController. 我可以通过制作一个自定义的ODataPathHandler来做到这一点,但这不是正确的做法. 解决方法
那就对了.您不需要自定义路径处理程序.它表示我们理解的有效OData URL,可以将其解析为ODataPath.您需要的是自定义路由约定.路由约定将ODataPath映射到控制器和操作.默认情况下,我们仅提供处理WCF DS客户端生成的URL的基本路由约定.看起来您正在使用我们没有路由约定的URL.写一个很简单.例,
public class ContainmentRoutingConvention : IODataRoutingConvention { public string SelectAction(ODataPath odataPath,HttpControllerContext controllerContext,ILookup<string,HttpActionDescriptor> actionMap) { IEdmEntitySet entitySet = odataPath.EntitySet; if (odataPath.PathTemplate == "~/entityset/key/navigation") { controllerContext.RouteData.Values["key"] = (odataPath.Segments[1] as KeyValuePathSegment).Value; return "Get" + entitySet.Name; } else if (odataPath.PathTemplate == "~/entityset/key/navigation/key") { controllerContext.RouteData.Values["key1"] = (odataPath.Segments[1] as KeyValuePathSegment).Value; controllerContext.RouteData.Values["key2"] = (odataPath.Segments[3] as KeyValuePathSegment).Value; return "Get" + entitySet.ElementType.Name; } return null; } public string SelectController(ODataPath odataPath,HttpRequestMessage request) { if (odataPath.PathTemplate == "~/entityset/key/navigation" || odataPath.PathTemplate == "~/entityset/key/navigation/key") { IEdmNavigationProperty navigationProperty = (odataPath.Segments[2] as NavigationPathSegment).NavigationProperty; IEdmEntitySet entitySet = odataPath.EntitySet; // the target entity set,which would be 'SubItems'; return entitySet.Name; } return null; } } 这只会处理你提到的两个网址.应该很容易扩展以支持其他网址. 处理?/ entityset / key / navigation的动作的签名将是IEnumerable< Order> GetOrders(int key)和url~ / entityset / key / navigation / key,它将是Order GetOrder(int key1,int key2). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC URL解码
- asp.net-mvc – 如何在ChildAction上删除OutputCache?
- asp.net – 强制按钮控制在回发之前运行其客户端
- 在大型asp.net C#Web应用程序中修复SQL注入表单
- asp.net-mvc – MVC 4中的ReportViewer部分
- asp.net-mvc – 使用ASP.NET MVC 2 AsyncController实现长时
- asp.net-mvc-4 – 正确使用IItemTransform来纠正CSS捆绑ASP
- asp.net – .Net ADO连接类
- ASP.NET Web API中除IQueryable之外的OData查询和类型
- asp.net-mvc – 如何创建从httpget获取相同参数的httppost?
- asp.net – 无法加载文件或程序集“System.Web.M
- asp.net-mvc – 你在哪里把你的验证放在asp.net
- asp.net-mvc – 使用Facebook和Twitter登录ASP.N
- webforms – ASP.NET Web窗体(4.5)强类型模型绑定
- asp.net中程序水晶报告的正确形式是什么?和视觉
- asp.net-mvc – 以编程方式隐藏全局菜单项的Razo
- 在updatepanel asp.net c#中的AsyncFileUpload中
- asp.net-core – 在程序集’ef’上找不到’UserS
- asp.net – Databinder.Eval和Container.DataIte
- asp.net-mvc – 如何在ASP.NET MVC路由中使用带有