asp.net - modele - Routage ASP MVC avec un paramètre> 1



bouton asp net mvc (2)

J'ai l'itinéraire suivant défini

            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 correctement au contrôleur Milestone, l'action d'édition et transmet les valeurs.

Cependant, si j'essaie de construire le lien dans la vue avec une url.action -

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

Je reçois l'URL suivante

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

Cela fonctionne toujours, mais n'est pas très propre. Des idées?


Lors de la construction et de la mise en correspondance de routes dans le routage ASP.NET (ce que ASP.NET MVC utilise), la première correspondance appropriée est utilisée, et non la plus gourmande, et l'ordre est important.

Donc, si vous avez deux routes:

"{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, puisque vous avez fourni des valeurs par défaut pour {projectName} et {name}, il est totalement en conflit avec la route par défaut. Voici vos choix:

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

  • Déplacez d'abord l'itinéraire le plus long et rendez-le plus explicite afin qu'il ne corresponde pas à l'itinéraire par défaut, tel 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 == Home correspondront à la première route, et toutes les routes avec le contrôleur! = Home correspondra à la deuxième route.

  • Utilisez RouteLinks au lieu de ActionLinks, nommant spécifiquement l'itinéraire que vous voulez afin qu'il fasse le lien correct sans ambiguïté.


Tu peux essayer

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




url-rewriting