Controller not filtering data in Breeze query in DotNetNuke Module

后端 未结 1 456
既然无缘
既然无缘 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.

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

    [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. Let's assume that the userInfoController.GetUsers() method inside your method returns IQueryable. 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. 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 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)
提交回复
热议问题