2010-05-07 3 views
0

J'ai un itinéraire défini avec plusieurs segments (non codées en dur paramètres):générer des liens pour des itinéraires avec des segments d'URL non-paramètre sur ASP.NET MVC 2

routes.MapRoute(null, "suggestion/list/by/{tag}", 
     new { controller = "Suggestion", action = "List", tag = UrlParameter.Optional }); 

suppose que je suis dans la vue Index des SuggestionController, qui possède un objet Suggestion pour Model, comment puis-je créer un lien correspondant à cette route?

Je sais que je peux j'accomplir en utilisant plaine ol » html comme:

<a href="/suggestion/list/by/<%=Model.Tag %>"><%=Model.Tag %></a> 

Mais cela ne permet pas de transmettre d'autres paramètres de l'itinéraire (comme RouteValueDictionary, par exemple), non?

Je me demandais en fait s'il serait possible d'utiliser l'un des assistants fournis, mais sans nommer l'itinéraire. Je préférerais garder le nom de la route comme nul afin d'éviter de coder en dur sur mes vues, mais je n'arrive pas à comprendre comment utiliser ces segments sans paramètre dans les méthodes Html.ActionLink ou RouteLink.

Des idées?

Merci d'avance.

Répondre

1

Les méthodes d'assistance prendront en compte les routes que vous avez configurées pour que vous puissiez les utiliser et elles afficheront les URL comme vous le souhaitez. Par exemple:

<%= Html.Action(Model.Tag, "List", "Suggestion", new { tag = Model.Tag }, null) %> 

Ou mieux encore, si vous utilisez l'assemblage à terme MVC, vous serez en mesure de faire disparaître les cordes magiques et faire:

<%= Html.Action<SuggestionController>(c => c.List(Model.Tag), Model.Tag) %> // Add checks for null if Tag can be null 

EDIT: Comme il est indiqué dans les commentaires, il ya une faute de frappe ci-dessus, les appels à l'action, devrait être ActionLink

+0

Merci pour notre réponse s1mm0t. 2 choses: J'imagine que vous vouliez dire Html.ActionLink sur le premier extrait de code (Html.Action n'a pas cette surcharge), donc j'ai essayé ActionLink comme vous l'avez suggéré mais il rend l'itinéraire suivant: /suggestion/list/by? Tag = TestTag qui, bien sûr, ne fonctionne pas. Je devais en fait rendre: /suggestion/list/by/TestTag Est-ce que je manque quelque chose dans la définition d'itinéraire? –

+0

Oui, vous avez raison, il y a une faute de frappe dans la solution au-dessus de laquelle j'ai maintenant ajouté une modification. Je l'ai testé deux fois maintenant et ça marche bien pour moi avec les deux solutions ci-dessus (en utilisant ActionLink évidemment, O)). Votre route est-elle définitivement utilisée? Les routes les plus spécifiques doivent être ajoutées en premier, sinon une route plus générale sera utilisée. Essayez d'ajouter votre itinéraire ci-dessus en tant que première route, juste comme un test, puis essayez d'utiliser ActionLink. – s1mm0t

+0

Ok c'est embarrassant ... J'ai eu une faute de frappe dans la définition de ma route pour le * seul paramètre * en elle. Mon itinéraire a été défini comme suggestion/liste/par/{it}, ce qui bien sûr rendra le tap comme paramètre de chaîne de requête. : þ Merci s1mm0t, vous allez à la maison avec la bonne réponse;) –

1

Je crois qu'il est préférable d'utiliser la méthode RouteLink dans ce cas. En utilisant RouteLink, vous pouvez définir explicitement le nom de l'itinéraire que vous voulez utiliser. Donc, si vous n'avez aucune autre raison de ne pas mettre un nom dans la route, nommez-le comme "suggestion" (ou toute autre chose que vous voulez). Ainsi, le RouteLink sera:

<%: Html.RouteLink(Model.Tag, "suggestion", new RouteValueDictionary { tag = Model.Tag }) 

J'ai eu un problème similaire avec un itinéraire complexe, ce qui était la seule solution que j'ai trouvé. Espérons que ça aide ...

+0

Réservoirs.Je savais que cela fonctionnerait, mais j'étais curieux de savoir si cela serait possible sans coupler étroitement mes vues à mes définitions d'itinéraires. Cela doit sûrement être possible? –

Questions connexes