Конфликт страниц и страниц - ASP.Net Core Razor Pages конфликтует с разбиением на страницы метода контроллера MVC - PullRequest
0 голосов
/ 12 октября 2018

В 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: Следующие ошибки произошли с информацией о маршрутизации атрибута:

Для действия: 'MyApiProject.Controllers.AccountController.GetUsers (MyApiProject)'

Ошибка: Атрибут маршрута 'api / Account / users /{page: int} / {pageSize: int} ' не может содержать параметр с именем' {page} '.Используйте '[page]' в шаблоне маршрута, чтобы вставить значение '' .

Код метода не должен быть изменен, так как он отлично работает с существующим Angular spa.Так в чем же обход?

1 Ответ

0 голосов
/ 12 октября 2018

При использовании 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 напрямую.Если бы это был параметр строки запроса, это была бы другая история.

...