Параметры маршрутизации Asp.Net Core всегда 0 или ноль

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

Вот определение контроллера (небольшая инъекция зависимостей, но стандартная):

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);

    //...

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

Я называю это так:

https: // локальный / серия / 3 / заголовок

или

https: // локальный / серия / 4 /

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

Это произойдет, если я введу его в адресную строку или укажу идентификатор вручную (например, / 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 / мегаполисы - представление сообщает id = 14.

Это работает: https: // localhost: 44319 / series / 5 / мегаполисы - представление отчетов id = 5

Это работает: https: // localhost: 44319 / series / 14 / business-with-china - представление сообщает id = 14.

Не работает: https: // localhost: 44319 / series / 5 / business-with-china - переходит в https: // локальный: 44319 / серия / 0.

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

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

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

Можете ли вы поделиться конфигурацией маршрутизации?

Mohsin Mehmood 01.09.2018 17:45

Я добавил это выше! Спасибо.

user5956088 01.09.2018 17:48

Вы пробовали поставить [FromRoute] перед своими параметрами?

Jason Roner 01.09.2018 17:51

Спасибо. [FromRoute} не имеет никакого значения. :(

user5956088 01.09.2018 18:02

Извините, какая косая черта в начале? - Значит, он читает series / {id; int?} / {Title?}

user5956088 01.09.2018 19:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
7 594
4

Ответы 4

  1. Удалите routes.MapRoute, это не обязательно для веб-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
 }

Это не веб-API. Стандартный MVC.

user5956088 01.09.2018 18:03

@ user5956088 понял. у нас есть два способа указать маршрут: MapRoute или атрибуты. Вы можете оставить MapRoute для обычных ситуаций и изменить атрибут, как я сказал.

WhoKnows 01.09.2018 18:05

Это работает! Большое спасибо!

Karishma 13.04.2021 12:00

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

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

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

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

[HttpGet("/foo/{param1}")]
public ActionResult Foo(int param2)
{
  //code here
}

У меня была такая же проблема, поэтому я нашел эту ссылку. Я случайно нашел решение своей проблемы, так что даже оно не связано с вашим, я отправляю его для всех, кто приходит сюда, у кого может быть такая же проблема, как и у меня. Я использую C# и .net Core 2.2 Независимо от того, что я делал, я получал значение id равным 0. Случилось так, что выбранное мной имя параметра, которое было "page", номер страницы, должно было иметь "id" то же имя, что и указанное в {id?}

Другие вопросы по теме