ODataProperties NextLink是Null

时间:2014-08-06 17:24:38

标签: c# rest asp.net-web-api odata

我有一个使用.NET 4.5的OData Web API服务。它有一个WebApi控制器,它来自我自己创建的另一个控制器。

public class AerodromoController : BaseController
{
    public PageResult<Aerodromo> Get(ODataQueryOptions<Aerodromo> options)
    {
        return Paging(Store.Aerodromo.All(), options);
    }
}

这个&#39; Paging&#39;方法来自BaseController并执行如下操作:

public class BaseController : ApiController
{
    public PageResult<T> Paging<T>(IQueryable<T> query, ODataQueryOptions<T> options)
    {
        IQueryable Data;
        if (options.Top != null)
        {
            Data = options.ApplyTo(query, new ODataQuerySettings() { PageSize = options.Top.Value });
        }
        else
        {
            Data = options.ApplyTo(query);
        }

        return new PageResult<T>(
            Data as IEnumerable<T>,
            Request.ODataProperties().NextLink,
            query.Count());
    }
}

发出像这样的ajax请求后:

$.getJSON('acompanhamento/aerodromo?$' + encodeURI("top=20"))

我确实得到了前20个实体和计数。但是nextPageLink为null。这有点奇怪,导致以下代码工作。可能会发生什么?

public class AerodromoController : BaseController
{
    public PageResult<Aerodromo> Get(ODataQueryOptions<Aerodromo> options)
    {
        var Data = options.ApplyTo(Store.Aerodromo.All(), new ODataQuerySettings()
        {
            PageSize = 20
        });
        return new PageResult<Aerodromo>(
            Data as IEnumerable<Aerodromo>,
            Request.ODataProperties().NextLink,
            Store.Aerodromo.All().Count());
    }
}

1 个答案:

答案 0 :(得分:0)

此行错误

if (options.Top != null)
    {
        Data = options.ApplyTo(query, new ODataQuerySettings() { PageSize = options.Top.Value });
    }

如果你在客户端说你需要20个结果($ top = 20),并且在服务器端你将最大页面大小设置为20,api的用户将不会获得nextPageLink,因为他得到了什么他想要。

如果客户端想要超过您在服务器端设置的最大PageSize,则会获得nextPageLink。 另外我认为你需要验证ODataQueryOptions的选项。

不要将PageSize设置为options.Top.Value

var allowedOptions = new ODataValidationSettings
        {
            AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Filter | AllowedQueryOptions.Skip |
                                  AllowedQueryOptions.OrderBy | AllowedQueryOptions.InlineCount
        };

options.Validate(allowedOptions);

var Data = options.ApplyTo(Store.Aerodromo.All(), new ODataQuerySettings()
    {
        PageSize = 10 // now you get a next page link when u say $top=20
    });