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

时间:2018-10-12 13:46:59

标签: c# angular asp.net-core razor-pages asp.net-core-mvc-2.1

在带有Angular 6 spa项目的ASP.Net Core 2.1中,我使用此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文件夹,项目将开始运行而没有错误。

这是错误描述:

  

RouteCreationException:属性路由信息发生以下错误:

     

操作:'MyApiProject.Controllers.AccountController.GetUsers   (MyApiProject)'

     

错误:属性路由   'api / Account / users / {page:int} / {pageSize:int}'不能包含   参数名为“ {page}”。在路由模板中使用“ [页面]”插入   值

方法代码无需更改,因为它可以与现有的Angular spa一起正常工作。那么解决方法是什么?

1 个答案:

答案 0 :(得分:2)

使用ASP.NET Core MVC剃刀页时,{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。如果这是一个查询字符串参数,那就不一样了。