ASP.NET MVC маршрутизация - пытается получить имя в URL - PullRequest
2 голосов
/ 25 июля 2009

В настоящее время у меня есть следующие маршруты:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.gif/{*pathInfo}");

MvcRoute.MappUrl("{controller}/{action}/{ID}")
    .WithDefaults(new { controller = "home", action = "index", ID = 0 })
    .WithConstraints(new { controller = "..." })
    .AddWithName("default", routes)
    .RouteHandler = new MvcRouteHandler();

MvcRoute.MappUrl("{title}/{ID}")
    .WithDefaults(new { controller = "special", action = "Index" })
    .AddWithName("view", routes)
    .RouteHandler = new MvcRouteHandler();

В SpecialController есть метод: public ActionResult Index(int ID)

Всякий раз, когда я указываю своему браузеру http://hostname/test/5, я получаю следующую ошибку:

Словарь параметров содержит пустую запись для параметра 'ID' ненулевого типа 'System.Int32' для метода 'System.Web.Mvc.ActionResult Index (Int32)' в 'SpecialController',Чтобы сделать параметр необязательным, его тип должен быть либо ссылочным типом, либо типом Nullable. Имя параметра: параметрыОписание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Почему это так? Я использовал отладчик маршрута mvccontrib, и кажется, что маршрут доступен, как и ожидалось.

Ответы [ 3 ]

4 голосов
/ 25 июля 2009

Я думаю, вы должны поставить свой собственный маршрут перед по умолчанию.

http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

3 голосов
/ 07 января 2010

Я предлагаю решение, если имена переменных вашего маршрута не совпадают с именами параметров вашего действия.

// Global.asax.cs
MvcRoute.MappUrl("{controller}/{action}/{ID}")
        .WithDefaults(new { controller = "home", action = "index", ID = 0 })
        .WithConstraints(new { controller = "..." })
        .AddWithName("default", routes)
        .RouteHandler = new MvcRouteHandler();

Это будет работать:

// Controller.cs
public ActionResult Index(int ID){...}

Где это не будет:

// Controller.cs
public ActionResult Index(int otherID) {...}
2 голосов
/ 25 июля 2009

Это именно так, как говорится в сообщении об ошибке. У вас есть параметр с именем «ID», который не имеет значения по умолчанию, но ваш метод ожидает ненулевое значение int. Поскольку значения по умолчанию нет, он пытается передать значение «ноль», но ... он не может этого сделать, потому что ваш параметр int не имеет значения NULL.

Отладчик маршрута, вероятно, не проверяет типыдля nullable.

Чтобы исправить это:

 MvcRoute.MappUrl("{title}/{ID}")
        .WithDefaults(new { controller = "special", action = "Index", ID = 0 })
        .AddWithName("view", routes)
        .RouteHandler = new MvcRouteHandler();
...