2008-11-27 4 views
3

J'ai l'itinéraire suivant définiASP MVC routage avec> 1 paramètre

  routes.MapRoute(
      "ItemName", 
      "{controller}/{action}/{projectName}/{name}", 
      new { controller = "Home", action = "Index", name = "", projectName = "" } 
      ); 

Cette route fonctionne réellement, donc si je tape dans le navigateur

/Milestone/Edit/Co-Driver/Feature complete 

Il va bien au contrôleur de Milestone, l'action d'édition et transmet les valeurs.

Cependant, si je tente de construire le lien dans la vue avec un url.action -

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%> 

je reçois l'adresse suivante

Milestone/Edit?name=Feature complete&projectName=Co-Driver 

Il fonctionne toujours, mais est pas très nettoyer. Des idées?

Répondre

5

Lors de la construction et les routes correspondant dans le routage ASP.NET (qui est ce que ASP.NET MVC utilise), le premier match approprié est utilisé, pas cupide, et l'ordre est important .

Donc, si vous avez deux voies:

"{controller}/{action}/{id}" 
"{controller}/{action}/{projectName}/{name}" 

dans cet ordre donné, le premier sera utilisé. Les valeurs supplémentaires, dans ce cas projectName et name, deviennent des paramètres de requête. En fait, comme vous avez fourni des valeurs par défaut pour {nomProjet} et {nom}, il est totalement en conflit avec la route par défaut. Voici vos choix:

  • Supprimer la route par défaut. Faites-le si vous n'avez plus besoin de l'itinéraire par défaut.

  • Déplacer la route plus longue d'abord, et de le rendre plus explicite afin qu'il ne correspond pas à la route par défaut, tels que:

    routes.MapRoute(
        "ItemName", 
        "Home/{action}/{projectName}/{name}", 
        new { controller = "Home", action = "Index", name = "", projectName = "" } 
    ); 
    

    De cette façon, toutes les routes avec le contrôleur == Accueil correspondra à la première route, et toutes les routes avec contrôleur! = Accueil correspondra à la deuxième route. Utilisez RouteLinks au lieu de ActionLinks, nommant spécifiquement la route que vous voulez afin qu'elle fasse le lien correct sans ambiguïté.

0

Vous pouvez essayer

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title}); 
1

Juste pour éclaircir, voici ce que j'ai finalement fait pour le résoudre, grâce à la réponse de @Brad

<%=Html.RouteLink("Edit", "ItemName", new { projectName=m.Project.title, name=m.name, controller="Milestone", action="Edit"})%>