2

在一个带有 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}”的参数。在路由模板中使用 '[page]' 插入值 ''

方法代码无需更改,因为它与现有的 Angular spa 配合得很好。那么解决方法是什么?

4

1 回答 1

3

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

[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直接使用。如果这是一个查询字符串参数,那将是另一回事。

于 2018-10-12T14:12:15.920 回答