问题描述
我想包括DotNetNuke的模块中的基本微风样品(它在独立的WebAPI项目正常工作)。为了简化事情,我删除客户端,将只是参考网址JSON调用我做了Chrome浏览器。
我可以看到我的元数据和物品,如的完整列表:
然而,当我尝试从URL过滤列表,它总是返回完整列表,例如
的
我认为这是值得做的我已经宣布了MapHTTRoute的方式。问题是,DotNetNuke的模块没有Global.ascx。我抄BreezeWebApiconfig.cs文件到我的App_Start文件夹,这样做火,当我调试,但是DotNetNuke的使用机制,为注册路线:
使用DotNetNuke.Web.Api;命名空间SmartThinker.Modules.Framework
{
公共类RouteMapper:IServiceRouteMapper
{
公共无效的RegisterRoutes(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute(框架,BreezeApi,清风/ {控制器} / {行动},新的[] {SmartThinker.Modules.Framework.Controllers});
}
}
}
我在和但似乎它的东西做DNN注册路由的方式。反正有做到这一点,而无需使用BreezeWebApiConfig.cs?
我的控制器code有BreezeController属性。 (当我做样本客户机连接到它我得到的项目列表 - ?它只是不过滤,所以我认为这是值得的OData的行动过滤器如何调试问题出在哪里。
更新1)
这里是元数据:
该GetUsers方法:
和GetUsers方法试图通过用户名进行过滤(不工作,这是问题)
的 (此方法返回的IQueryable)
下面是控制器:
[BreezeController]
公共类DareController:DnnApiController
{
私人只读EFContextProvider< FrameworkContext> contextProvider =新EFContextProvider< FrameworkContext>(); [使用AllowAnonymous]
[HTTPGET]
公众的Htt presponseMessage元数据()
{
VAR响应= Request.CreateResponse(的HTTPStatus code.OK,contextProvider.Metadata());
返回GetResponseWithCorsHeader(响应);
} [使用AllowAnonymous]
[HTTPGET]
公众的Htt presponseMessage GetUsers()
{
VAR userInfoController =新UserInfoController(); VAR响应= Request.CreateResponse(的HTTPStatus code.OK,userInfoController.GetUsers());
返回GetResponseWithCorsHeader(响应);
} [使用AllowAnonymous]
[HTTPGET]
公开IQueryable的<使用者> GetUsersWithoutCors()
{
返回contextProvider.Context.Users;
}
}
路由是不是一个真正的微风问题。你的服务器路由如何要求你的控制器是由你。我们做外的开箱什么是无数当中很多只是一种方式。
您有 [BreezeController]
属性控制器上是吗?你可以把样品端点,在那里我们可以打它。可能会从一些线索。同时发布控制器。一个小小的例子应该做的事...返回的元数据和一个方法返回的IQueryable。
更新2013年6月25日
我认为你在路上发现一个bug我们的 [BreezeController]
发现方法返回的IQueryable< T>
的 [BreezeController]
属性会扫描你的Web API控制器的方法和(有效)适用的 [BreezeQueryable]
属性回归方法的IQueryable< T>
I see now that your GetUsers()
method returns HttpResponseMessage
rather than IQueryable<User>
. Let's assume that the userInfoController.GetUsers()
method inside your method returns IQueryable<User>
. Otherwise, the OData query parameters will not apply and we'll have to take this in a different direction. Moving along ...
I checked with v.1.3.6 of the Breeze.WebApi.dll and it does not detect that the HttpResponseMessage
is wrapping IQueryable<T>
. Therefore, it does not apply the client's OData query criteria (or any other OData modifiers for that matter). This shortcoming (in my opinion) is a bug. The following should be equivalent implementations:
[HttpGet]
public IQueryable<TodoItem> Todos() {
return _repository.Todos;
}
[HttpGet]
public HttpResponseMessage TodosWrapped()
{
return Request.CreateResponse(HttpStatusCode.OK, _repository.Todos);
}
The second, "wrapped" method does not respect the OData query parameters.
Fortunately, there is a workaround until we get this fixed. Just add the [BreezeQueryable]
attribute explicitly ... as in:
[HttpGet]
[BreezeQueryable]
public HttpResponseMessage TodosWrapped()
{
return Request.CreateResponse(HttpStatusCode.OK, _repository.Todos);
}
I confirmed that this approach does work.
Thanks for finding this.
Use OData query syntax
A colleague also noticed that your query URL does not use the OData query syntax. You wrote:
... /todos?=DareId%20eq%204
when it should be
... /todos/?$filter=DareId%20eq%204
Make sure you use ?$filter=
这篇关于控制器在DotNetNuke的模块没有过滤微风中查询数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!