В ASP.Net Core 2.1 с проектом Angular 6 spa я возвращаю разбитый на страницы список пользователей, используя этот метод 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: 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 напрямую. Если бы это был параметр строки запроса, это была бы другая история.