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());
}
}
这一行不对
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
});