【发布时间】:2020-09-01 09:40:11
【问题描述】:
我有这两段代码来实现分页。
第一个类如下:
public class QueryParameters
{
const int _maxSize = 100;
private int _size = 50;
public int Page { get; set; }
public int Size
{
get { return _size; }
set { _size = Math.Min(_maxSize, value); }
}
}
第二个是我的HttpGet代码:
private readonly NSContext _context;
public UsersController(NSContext context)
{
_context = context;
}
[HttpGet]
public async Task<IActionResult> GetAllUSers([FromQuery] QueryParameters queryParameters)
{
IQueryable<User> users = _context.User;
users = users
.Skip(queryParameters.Size * (queryParameters.Page - 1))
.Take(queryParameters.Size);
return Ok(await users.ToArrayAsync());
}
但是当我运行程序时,我得到了这个错误:
【问题讨论】:
-
尝试为 Page 属性赋予 [Range(1, int.MaxValue)] 属性以进行客户端验证,或手动调整
if Page is 0 then set Page = 1以获取服务器端容差。 -
猜猜:你的前端使用 0 来表示第一页。当
queryParameters.Page为 0 时会发生什么?您减去 1,参数变为负数。它直接用作OFFSET的参数,然后是错误。如果是这种情况,请将您的前端更改为使用 1 或检查QueryParameters中的默认值(以防前端发出没有值的请求)或不要减去 1。 -
调试并验证“queryParameters.Page”没有变为零。但是,一般来说,您的代码应确保“queryParameters.Page”不会变为零,因为这会导致“-queryParameters.Size”
-
您需要绝对确定
.Skip()的值永远不会是负数;现在,使用.Skip(queryParameters.Size * (queryParameters.Page - 1))- 如果您的Page值为0,那么您会得到-queryParameters.Size的结果,这是不允许的...... -
你是对的。从此命令
(queryParameters.Page -1)中删除 -1,问题就解决了。非常感谢
标签: c# asp.net-core pagination entity-framework-core