分页和页面冲突 - ASP.Net 核心 Razor 页面与 MVC 控制器方法分页冲突

Pagination and Pages conflict - ASP.Net Core Razor Pages conflicts with MVC controller method pagination

在 ASP.Net Core 2.1 和 Angular 6 spa 项目中,我 return 使用此 AccountController.cs 方法的用户分页列表:

[HttpGet("users")]
[Produces(typeof(List<UserViewModel>))]
public async Task<IActionResult> GetUsers()
{
    return await GetUsers(-1, -1);
}

[HttpGet("users/{page:int}/{pageSize:int}")]             <---- conflicts here
[Produces(typeof(List<UserViewModel>))]
public async Task<IActionResult> GetUsers(int page, int pageSize)
{
    var users = await _accountManager.GetUsersLoadRelatedAsync(page, pageSize);
    return Ok(Mapper.Map<List<UserViewModel>>(users));
}

在startup.cs中我使用MVC如下:

app.UseMvc(routes =>
{
    routes.MapRoute("blog", "blog/{*article}", defaults: new { controller = "Blog", action = "Article" });
    routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

上述代码工作正常,但由于我想在我的项目中开始使用 Razor Pages,我创建了一个新的标准 Razor Pages 项目模板并将其 Pages 文件夹添加到当前项目,但一旦我这样做那和 运行 我得到错误的项目,如果我再次移出 Pages 文件夹,项目开始 运行ning 没有错误。

错误描述如下:

RouteCreationException: The following errors occurred with attribute routing information:

For action: 'MyApiProject.Controllers.AccountController.GetUsers (MyApiProject)'

Error: The attribute route 'api/Account/users/{page:int}/{pageSize:int}' cannot contain a parameter named '{page}'. Use '[page]' in the route template to insert the value ''.

方法代码无需更改,因为它与现有的 Angular 水疗中心一起工作得很好。那么解决方法是什么?

当使用 ASP.NET Core MVC Razor Pages 时,{page} 成为有效的 保留字 ,就像 {controller}{action} 是在使用传统 MVC 控制器和操作时。为了解决这个问题,您可以简单地使用其他东西来表示执行分页时所需的页码。例如:

[HttpGet("users/{pageNumber:int}/{pageSize:int}")]
[Produces(typeof(List<UserViewModel>))]
public async Task<IActionResult> GetUsers(int pageNumber, int pageSize)
{
    var users = await _accountManager.GetUsersLoadRelatedAsync(pageNumber, pageSize);
    return Ok(Mapper.Map<List<UserViewModel>>(users));
}

因为您之前使用 {page} 作为路由值,将其切换为 {pageNumber} 不会影响调用应用程序,因为它们没有直接使用 page。如果这是一个查询字符串参数,那就另当别论了。