分页和页面冲突 - 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
。如果这是一个查询字符串参数,那就另当别论了。
在 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
。如果这是一个查询字符串参数,那就另当别论了。