2009-07-25 5 views
2

J'ai actuellement les routes suivantes:routage ASP.NET MVC - essayer d'avoir un nom dans l'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(); 

Le SpecialController a une méthode: public ActionResult Index(int ID)

Chaque fois que je pointe mon navigateur pour http://hostname/test/5, Je reçois l'erreur suivante:

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.

Pourquoi est-ce? J'ai utilisé le débogueur de route mvccontrib, et il semble que la route est accessible comme prévu.

Répondre

2

C'est exactement ce que dit le message d'erreur. Vous avez un paramètre appelé "ID" qui n'a pas de valeur par défaut, mais votre méthode attend un int non nullable. Parce qu'il n'y a pas de valeur par défaut, il essaie de passer un "null", mais ... il ne peut pas, parce que votre paramètre int est non-nullable.

Le débogueur de route ne vérifie probablement pas les types pour nullable.

Pour résoudre ce problème:

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

je ne pense que c'est la cause de cas, même après i ajouté l'ID par défaut (que j'avais essayé avant aussi bien) il jette toujours la même exception. – Yannis

+0

Pouvez-vous poster le code pour votre méthode d'extension MappUrl? – womp

+0

ce n'est pas mon code. Cela fait partie de la mvccontrib et je n'ai pas la source disponible – Yannis

4

Je pense que vous devriez mettre votre itinéraire personnalisé avant par défaut.

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

+0

+1 Je pense que vous pouvez être ici. Consultez également l'article de Phil Haack sur le débogage d'itinéraire: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx –

+0

malheureusement ce n'est pas la solution non plus. mais vous avez raison en ce que le défaut devrait aller à la fin pour être traité en dernier recours. – Yannis

+0

J'ai peur que ce soit un défaut de mvccontrib. J'ai essayé votre scénario en mappant la route directement dans RouteCollection (n'utilisant pas mvccontrib) et cela a fonctionné comme prévu. –

3

Je propose la solution était les noms des variables d'itinéraire ne correspondait pas à vos noms de paramètres d'action.

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

Cela fonctionnerait:

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

où ce ne serait pas:

// Controller.cs 
public ActionResult Index(int otherID) {...} 
+0

Je ne connais pas le modèle de code de routage ci-dessus. quelle est la signification de .WithConstraints (new {controller = "..."}) et .AddWithName ("default", routes) quel serait le nom du contrôleur ici? – Thomas