ODataProperties NextLink is Null

本文关键字:Null is NextLink ODataProperties | 更新日期: 2023-09-27 18:16:52

我有一个使用。net 4.5的OData Web API服务。它有一个WebApi控制器派生自我自己做的另一个控制器。

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

这个'Paging'方法来自于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是空的。这有点奇怪,因为下面的代码可以工作。会发生什么?

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());
    }
}

ODataProperties NextLink is Null

这一行不对

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

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

你得到一个nextPageLink,如果客户端想要超过你在服务器端设置的最大PageSize。另外,我认为您需要验证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
    });