DotNetNuke的模块没有

DotNetNuke的模块没有

本文介绍了控制器在DotNetNuke的模块没有过滤微风中查询数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想包括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的模块没有过滤微风中查询数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 12:36