2010-12-14 16 views
1

J'ai un contrôleur Products avec l'action Details qui a un identifiant et Slug qui fonctionne comme suit:ASP.NET MVC: Routing a besoin URL exacte pour travailler

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

L'URL: localhost/Products/Details/1 et localhost/Products/Details/1/my-slug œuvres. Mais mettre ProductDetails route au sommet casse toute mon application. Pour accéder à ma page d'accueil, mon URL doit ressembler à: localhost/Home/Index.

localhost/Home ou tout contrôleur de ce type ne fonctionne pas. Il demande qu'un paramètre nullable soit dans ces actions.

L'erreur:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'MyProject.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

Répondre

3

Essayez ceci:

routes.MapRoute(
      "ProductDetails", // Route name 
      "Products/{action}/{id}/{title}", // URL with parameters 
      new { controller = "Products", action = "Details", id = "", title = UrlParameter.Optional } // Parameter defaults 
      ); 

L'itinéraire défini à chaque URL matchs avant l'URL par défaut. Vous avez donné des valeurs par défaut aux champs de contrôleur et d'action. Lorsque vous appelez http://localhost, il recherche la méthode Details de ProductsController et la trouve. Puisque id a une valeur de chaîne vide, vous obtenez l'exception null.

La route ci-dessus a une contrainte. Il correspond aux URL commençant par "Products" littéral. Cela ne casse donc pas votre route par défaut.

0

Ajout d'un nombre de contraintes (\ d) à la première route résoudrait le problème, car la route sur le dessus serait inutile sans carte d'identité valide.

+0

Je viens de le faire. Cela a fonctionné, merci. Pourquoi est-ce si? Pourriez-vous expliquer dans une étape de comment ces deux routes fonctionnent? –

+0

Étant donné que la route localehost/Home correspond aux définitions de route que vous avez définies et que la route de routage localhost/Home n'a pas de composant id, vous obtenez l'exception car le framework MVC tente d'attribuer une valeur nulle en raison de l'absence d'ID Paramètre et Int32 ne peut pas avoir une valeur nulle affectée. – Chandu