2009-03-03 6 views
5

J'ai mis en place un projet ASP.NET MVC, et tout fonctionne très bien, mais j'ai un problème avec le routage. Mon Global.asax ressemble à ceci:Le routage d'URL ASP.NET MVC ne me donne pas de jolies URL

public static void RegisterRoutes(RouteCollection routes) { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

Donc, rien d'extraordinaire. Mon problème est que quand je lien vers un contrôleur/action/params avec un Html.ActionLink comme ceci:

<%= Html.ActionLink("My link", "SomeAction", "SomeController", new {param="someParam"})%> 

il devrait générer (au moins ce qui fait sens dans ma tête) un lien tel que: http://www.localhost/SomeController/SomeAction/someParam.

Mais au lieu qu'il génère un lien comme celui-ci: http://localhost/SomeController/SomeAction?param=someParam

Si je fais manuellement un lien qui relie le résultat attendu (SomeController/uneAction/someParam) le contrôleur droit et de l'action sont appelés, mais le paramètre défini dans la méthode d'action est toujours nulle.

Des idées?

Répondre

4

Je pense que le lien n'utilisera la route par défaut comme vous attendez si le nom du paramètre est id au lieu de param. Vous devrez créer une route différente si vous voulez fournir un autre paramètre.

+0

Hmmm, cela signifie donc que je dois spécifier une nouvelle règle de routage pour chaque nouvelle action du contrôleur qui nécessite un ensemble différent de paramètres? Cela entraînerait une grande quantité de règles de routage pour une application d'entreprise. N'y a-t-il pas une approche plus dynamique que celle-là? – Erik

+1

Si cela était vraiment dynamique, ne perdriez-vous pas la sécurité de type, la sécurité des paramètres et la testabilité? – bzlm

5

essayer d'ajouter:

routes.MapRoute(
        "Default",                        // Route name 
        "{controller}/{action}/{param}",             // URL with parameters 
        new { controller = "Home", action = "Index", param = "" } // Parameter defaults 
      );