2010-02-11 4 views
1

J'ai du mal à faire fonctionner une Route afin de contraindre les paramètres d'une action d'un contrôleur à être uniquement des entiers.ASP.NET MVC Route ne fonctionnant pas avec contrainte

J'ai aa action du contrôleur comme suit:

[RequiresRole(RoleToCheckFor = "Administrator"), AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Edit(int id) 
    { 
     ... 
    } 

et les routes suivantes: Global.asax.cs

 routes.MapRoute(
      "UserEdit",  
      "user/edit/{id}",  
      new {controller = "user", action = "edit"}, 
      new {id = @"\d+"} 
      ); 

     routes.MapRoute(
      "Default",            
      "{controller}/{action}/{id}",       
      new { controller = "Home", action = "Index", id = "" } 
      ); 

     routes.MapRoute("Error", 
       "{*url}", 
       new { controller = "Error", action = "notfound" }); 

J'attends donc que si j'entre http://domain.com/user/edit/ABCD i shouldn 't obtenir l'erreur habituelle suivante:

Le dictionnaire de paramètres contient un null entrée pour le paramètre « id » de type non annulable « System.Int32 » pour la méthode « System.Web.Mvc.ActionResult Edit (Int32) »

Ce (je pense) est précisément ce qui est dit aussi à http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-24-cs.aspx

Cependant, je vois encore l'erreur "... null entry ...".

Des idées pourquoi tout cela est-il ainsi? Est-ce que je fais quelque chose de mal avec la configuration de la route?

Merci

Répondre

3

votre deuxième itinéraire

routes.MapRoute(
     "Default",            
     "{controller}/{action}/{id}",       
     new { controller = "Home", action = "Index", id = "" } 
     ); 

rattrape et est sans contrainte.

Utilisez Phil Haacks route debugger for such issues

1

Comme Paul souligne, la route est correctement étant ignorée car la contrainte ne correspond pas à. Ainsi, le système de routage continue à l'itinéraire suivant et essaie de le faire correspondre. Parce que la deuxième route n'est pas contrainte, elle correspondra et sera traitée.

Il y a plusieurs façons de contourner ce problème.

L'un des moyens les plus simples consiste à supprimer la contrainte de la route et à effectuer la vérification de la validation des paramètres dans l'action du contrôleur.

Une autre façon est d'ajouter un itinéraire supplémentaire immédiatement après la route d'édition qui sert à afficher les erreurs:

routes.MapRoute(
     "UserEditError", 
     "user/edit/{id}", 
     new {controller = "user", action = "EditError"} 
     ); 

Notez que cette route n'a pas contrainte et va à une action EditError. De cette façon, vous pourriez être en mesure de fournir de meilleures erreurs pour les personnes qui tapent des URL non valides.

0

Une erreur que je parviens toujours à faire est de mettre

controller = "HomeController" au lieu de controller = "Home". Cela cassera vos itinéraires à chaque fois :-)

context.MapRoute(
    name: "RedirectAll", 
    url: "{*url}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { typeof(HomeController).Namespace }, 
        constraints: new { host = new HostConstraint("defenderrazor.com") });