Controller not filtering data in Breeze query in DotNetNuke Module

后端 未结 1 446
既然无缘
既然无缘 2021-01-24 09:03

I am trying to include the basic Breeze sample in a DotNetNuke module (it works fine in a standalone WebAPI project). To simplify things I remove the client and will just refer

相关标签:
1条回答
  • 2021-01-24 09:43

    The routing is not really a Breeze issue. How your server routes requests to your controller is up to you. What we do out-of-the-box is just one way among innumerable many.

    You have the [BreezeController] attribute on your controller yes? Can you put a sample endpoint up where we could hit it. Might get some clues from that. Also post the controller. A tiny example should do ... something returning metadata and one method returning IQueryable.

    Update 25 Jun 2013

    I think you've discovered a bug in the way our [BreezeController] discovers methods returning IQueryable<T>.

    The [BreezeController] attribute scans your Web API controller methods and (in effect) applies the [BreezeQueryable] attribute to methods returning IQueryable<T>.

    [BreezeQueryable] is an extension of the Web API's [Queryable] that adds support for $select, $expand, and nested $orderby ... all missing from the current [Queryable].

    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=

    0 讨论(0)
提交回复
热议问题