2009-07-25 1 views
2

У меня в настоящее время следующие маршруты:ASP.NET MVC маршрутизации - пытается иметь имя в URL

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, Я получаю следующую ошибку:

The parameters dictionary contains a null entry for parameter 'ID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'SpecialController'. To make a parameter optional its type should be either a reference type or a Nullable type.
Parameter name: parameters
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

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

ответ

2

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

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

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

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

я не думаю будет случай причина даже после того, как я добавил идентификатор по умолчанию (который я уже пробовали раньше также) он по-прежнему бросает одно и то же исключение. – Yannis

+0

Можете ли вы опубликовать код для вашего метода расширения MappUrl? – womp

+0

это не мой код. thats часть mvccontrib, и у меня нет источника. – Yannis

4

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

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

+0

+1 Я думаю, вы можете быть здесь. Также проверьте статью Фила Хаака «Отладка маршрута»: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx –

+0

, к сожалению, это не решение. но вы правы в том, что дефолт должен идти в конце, чтобы рассматриваться как последнее средство. – Yannis

+0

Я боюсь, что это может быть дефектом в mvccontrib. Я пробовал свой сценарий, сопоставляя маршрут непосредственно в RouteCollection (не используя mvccontrib), и работал, как ожидалось. –

3

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

// 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) {...} 
+0

Я не знаком с ур над шаблоном кода маршрутизации. в чем смысл .WithConstraints (new {controller = "..."}) и .AddWithName ("default", routes) Каким будет имя контроллера здесь? – Thomas