Получение нулевого значения параметра в контроллере при запуске маршрута MVC - PullRequest
5 голосов
/ 12 января 2011

Во-первых, я новичок в MVC, поэтому, пожалуйста, извините, если это просто.

Я использую пользовательский маршрут для создания следующего URL (http://mysite/subscriber/12345), где 12345 - номер абонента. Я хочу, чтобы он выполнял действие ShowAll в контроллере Subscriber. Мой маршрут запускается и используя отладчик маршрута Фила , когда я передаю вышеуказанный URL, отладчик маршрута показывает идентификатор как 12345. Мой контроллер принимает int как subscriberID. Когда это срабатывает, контроллер выдает ошибку

Словарь параметров содержит пустую запись для параметра id с ненулевым типом System.Int32.

Почему отладчик маршрута показывает значение, а контроллер его не видит?

Вот мой маршрут (первый - виновник)

 routes.MapRoute(
              "SubscriberAll",
              "subscriber/{id}",
              new { controller = "Subscriber", action = "ShowAll", id=0 },
              new { id = @"\d+" } //confirm numeric
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

Есть идеи, почему я получаю ноль в действии ShowAll? Вот подпись метода действия:

 public ActionResult ShowAll(int id)

Ответы [ 3 ]

5 голосов
/ 12 января 2011

Обнаружено, что сигнатура метода контроллера должна принимать строку, поскольку MVC не знает, к какому типу относится передаваемый параметр, и поэтому не может привести его к int, но может принудительно применить его через ограничение

Итак, маршрут, по которому я закончил, таков:

routes.MapRoute ( "SubscriberAll", "Абонент / {ID}", new {controller = "Subscriber", action = "ShowAll"}, new {id = @ "\ d +"} // подтверждение числового );

и подпись метода контроллера, с которой я закончил, это

 public ActionResult ShowAll(string id)
1 голос
/ 13 января 2011

Вместо записи "id = 0" в вашем MapRoute напишите "id = UrlParameter.Optional"

это определенно будет работать с вашим результатом действия

public ActionResult ShowAll(int id)

routes.MapRoute(
                  "SubscriberAll",
                  "subscriber/{id}",
                  new { controller = "Subscriber", action = "ShowAll", id = UrlParameter.Optional },
                  new { id = @"\d+" } //confirm numeric
                );
1 голос
/ 12 января 2011

Попробуйте удалить идентификатор из списка значений по умолчанию, т.е. просто наберите

new { controller = "Subscriber", action = "ShowAll" }
...