240 votes

Utiliser Html.ActionLink pour appeler une action sur un contrôleur différent

Je tente de naviguer entre les contrôleurs en utilisant ActionLink. Je vais vous expliquer mon problème avec un exemple.

Je suis sur la vue Index du contrôleur Hat, et j'essaie d'utiliser le code ci-dessous pour créer un lien vers l'action Details du contrôleur Product.

<%= Html.ActionLink("Détails", "Details", "Product", new { id=item.ID }) %>

Au lieu de créer un lien vers Details sur le contrôleur Product, cela génère un lien vers l'action Details sous le contrôleur Hat et ajoute un paramètre Length à la fin :

Hat/Details/9?Length=7

Je ne peux pas utiliser HTML.ActionLink pour passer d'un contrôleur à l'autre à cause de ce problème. Je vous serais reconnaissant si vous pouviez me dire ce que je fais de mal. Merci

PS : J'utilise le paramétrage de route par défaut fourni avec MVC

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

424voto

çağdaş Points 10552

Ce que vous voulez, c'est cette surcharge :

//linkText, actionName, controllerName, routeValues, htmlAttributes
<%=Html.ActionLink("Détails", "Détails", 
    "Produit", new {id = item.ID}, null) %>

1 votes

Pouvez-vous expliquer pourquoi cette surcharge particulière fonctionne et que celle de Korki ne fonctionne pas? Comment le fait de définir htmlAttributes sur null affecte-t-il le routage du lien?

35 votes

C'est parce que si vous utilisez les autres paramètres, cela suppose que le troisième argument est les valeurs de routage et le 4ème argument est les attributs HTML. Ajouter un 5ème argument force la méthode à utiliser la surcharge correcte. Parcourez les surcharges dans l'intellisense et cela aura plus de sens.

2 votes

La surcharge de ActionLink est vraiment maladroite. Le but principal d'accepter un 'object routeValues' au lieu d'un RouteValueCollection est de réduire la quantité de frappe. Cependant, vous vous retrouvez à devoir taper un null supplémentaire. Non intuitif et contre productif...

19voto

Stephan Venter Points 41

Avec ces paramètres, vous déclenchez la mauvaise fonction/méthode surchargée.

Ce qui a fonctionné pour moi:

<%= Html.ActionLink("Détails", "Détails", "Produit", new { id=item.ID }, null) %>

Cela déclenche HtmlHelper.ActionLink(string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)

J'utilise MVC 4.

Au revoir!

3 votes

Votre ligne de code ne déclenche pas la surcharge que vous mentionnez mais HtmlHelper.ActionLink(string linkText, string actionName, object routeValues, object htmlAttributes). Cela donne le même résultat que l'OP essayait d'éviter. Vous devez ajouter un paramètre null supplémentaire.

0 votes

Merci TiMoch, tu l'as ratée ?

10voto

James Avery Points 2538

Si vous téléchargez l'assembly MVC Futures (que je recommande fortement), vous pouvez alors utiliser un type générique lors de la création de l'ActionLink et une lambda pour construire la route :

<%=Html.ActionLink(c => c.Action( o.Value ), "Details" ) %>

Vous pouvez obtenir l'assembly futures ici : http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

0 votes

Merci pour le lien actuel - je cherchais à le trouver!

1 votes

Faites attention à cela car cela n'a pas été inclus dans MVC2. La raison en est que les Actions ne sont pas forcément des Méthodes (ce avec quoi je suis d'accord mais cela va être difficile à migrer car nous utilisons la méthode générique depuis un certain temps maintenant). Voici l'article complet sur la raison pour laquelle cela n'a pas été conservé dans la version 2: haacked.com/archive/2008/08/29/…

7voto

Craig Stuntz Points 95965

Vous touchez à la surcharge incorrecte d'ActionLink. Essayez ceci à la place.

<%= Html.ActionLink("Détails", "Détails", "Produit", new RouteValueDictionary(new { id=item.ID })) %>

6voto

sandy barasker Points 75

Essayez-le, ça fonctionne bien

  <%:Html.ActionLink("Détails","Details","Product",  new {id=item.dateID },null)%>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X