Параметры маршрутизации ядра Asp.Net всегда 0 или ноль - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть то, что я считаю очень стандартным контроллером:

Вот определение контроллера (немного внедрения зависимости, но стандартное):

public class SeriesController : Controller
{
    private readonly IHostingEnvironment  _env;

    public SeriesController(IHostingEnvironment env)
    {
        _env = env;
    }

    [HttpGet("/series/{id:int?}/{title?}")]
    public IActionResult Index(int id, string title)
    {
        if (id > 0)
        {
            var populateSeriesItem = new PopulateSeriesItem(_env, new SqlConnection());

            var seriesItem = populateSeriesItem.GenerateSeriesItem(id);

    //...

Если идентификатор отсутствует (или 0), то отображаются все записи; если оно равно 1 или больше, отображается одна запись. (Так клиент хочет!)

Я называю это следующим образом:

https://localhost/series/3/title

или

https://localhost/series/4/

но проблема в том, что id всегда равен 0 (и заголовок null).

Это тот случай, если я введу его в строку URL или укажу идентификатор вручную (т.е. / series? Id = 3)

Я просто не могу понять, чего мне не хватает.

Точно такая же настройка отлично работает с другим контроллером.

    [HttpGet("/books/{id:int?}/{title?}")]
    public ActionResult Index(int id, string title)
    {
        if (id > 0)
        {
            var populateBookItem = new PopulateBookItem(new  SqlConnection(), _env);

            var bookItem = populateBookItem.GenerateBookItem(id);

Это работает.

Это конфигурация маршрутизации (просто стандартная):

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

Я, должно быть, упускаю что-то очевидное, но я сбит с толку!

Любой совет с благодарностью.

Обновление:

Я удалил всю функциональность из контроллера. Я просто буквально передаю это в представление.

Это работает: https://localhost:44319/series/14/megacities - просмотр отчетов id = 14.

Это работает: https://localhost:44319/series/5/megacities - просмотр отчетов id = 5

Это работает: https://localhost:44319/series/14/business-with-china - просмотр отчетов id = 14.

Это не работает: https://localhost:44319/series/5/business-with-china - идет к https://localhost:44319/series/0.

Существуют другие URL-адреса, которые следуют тому же шаблону. Некоторые работают, некоторые не работают.

Если я уберу параметр title, все они, похоже, будут работать.

Понятия не имею почему!

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Спасибо всем за помощь.

Я решил проблему, хотя не знаю, что ее вызвало. (Я думаю, это могла быть проблема с кэшированием в браузере.)

Во всяком случае, я перезапустил сервер, и теперь все работает как надо.

0 голосов
/ 11 июня 2019

Если есть несоответствие в именах, параметр будет преобразован в значение по умолчанию - 0 в случае чисел и ноль в противном случае В приведенном ниже примере url имеет param1, тогда как метод имеет имя параметра как param2.

[HttpGet("/foo/{param1}")]
public ActionResult Foo(int param2)
{
  //code here
}
0 голосов
/ 01 сентября 2018
  1. Удалить routes.MapRoute, для Web API это не нужно.
  2. HTTPGet должен выглядеть как [HttpGet("/books/{id:int?}")]
  3. Добавить параметры запроса в запрос GET api/books/5?title=abc
  4. Определение метода:
 [HttpGet("/books/{id:int?}")]
 public ActionResult Index(int id, [FromQuery] string title)
 {
    //code here
 }
...