在带有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一起正常工作。那么解决方法是什么?
答案 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
。如果这是一个查询字符串参数,那就不一样了。