我有一个使用.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());
}
}
答案 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
});