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


224

J'essaie de naviguer entre les contrôleurs à l'aide de ActionLink. Je vais raconter 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 Détails du contrôleur de produit.

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

Au lieu de créer un lien vers Détails sur le contrôleur de produit, cela génère un lien vers l'action Détails sous le contrôleur Hat et ajoute un paramètre Longueur à la fin de celui-ci:

Hat/Details/9?Length=7

Je ne peux pas utiliser HTML.ActionLinkpour basculer entre les contrôleurs à cause de ce problème. J'apprécierai si vous pouvez me signaler ce que je fais mal. Merci

PS: j'utilise le paramètre de route par défaut fourni avec MVC

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

Réponses:


409

Ce que vous voulez, c'est cette surcharge:

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

1
Pouvez-vous expliquer pourquoi cette surcharge particulière fonctionne et celle de Korki ne fonctionne pas? Comment la définition de htmlAttributes sur null affecte-t-elle le routage du lien?
Derek Hunziker

35
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 htmlattributes. L'ajout d'un 5ème argument force la méthode à utiliser la surcharge correcte. Parcourez les surcharges dans intellisense et cela aura plus de sens.
Banford,

2
La surcharge d'ActionLink est vraiment maladroite. L'intérêt d'accepter un «objet routeValues» au lieu d'un RouteValueCollection est de réduire la quantité de saisie. Cependant, vous finissez par devoir taper un null supplémentaire. Non intuitif et contre-productif ...
TiMoch

3
Je suis d'accord, les paramètres de surcharge sont mal conçus .. Je pensais que c'était un bug depuis très longtemps. J'ai vraiment dû regarder une 9e fois l'intellisense pour comprendre que j'utilisais la mauvaise signature
Bkwdesign

1
Pour les futurs lecteurs, si vous rencontrez ce problème et que vous essayez d'ajouter un style CSS, c'est la surcharge correcte. @ Html.ActionLink ("MyText", "MyAction", "MyController", null, new {@class = "myClass"})
granadaCoder

17

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

Ce qui a fonctionné pour moi:

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

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

J'utilise MVC 4.

Cheerio!


2
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 le PO tentait d'éviter. Vous devez ajouter un paramètre null supplémentaire.
TiMoch

Merci TiMoch, vous avez manqué celui-là?
Stephan Venter

12

Pour des raisons de clarté, je recommanderais d'écrire ces assistants à l'aide de paramètres nommés:

@Html.ActionLink(
    linkText: "Details",
    actionName: "Details",
    controllerName: "Product",
    routeValues: new {
        id = item.ID
    },
    htmlAttributes: null
)

À partir de 2019, cette fonctionnalité est implémentée dans ReSharper par JetBrains. C'est en fait très utile dans cette circonstance.
Jamie

10

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

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

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


Merci pour le lien réel - j'essayais de le trouver!
Perhentian

1
Attention à cela, car il n'est pas inclus dans MVC2. Le raisonnement est que les actions ne sont pas nécessairement des méthodes (ce avec quoi je suis d'accord mais ça va être pénible de migrer car nous utilisons la méthode générique depuis un certain temps maintenant). Voici l'article complet sur les raisons pour lesquelles il n'a pas été conservé dans 2: haacked.com/archive/2008/08/29/…
Stu

7

Vous frappez mal la surcharge d'ActionLink. Essayez plutôt cela.

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

6

essayez ça marche bien

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

3

Une solution alternative serait d'utiliser l' Urlobjet d'assistance pour définir l' hrefattribut d'une <a>balise comme:

<a href="@Url.Action("Details", "Product",new { id=item.ID }) )">Details</a>

1

Notez que Détails est une page "Affichage" sous le dossier "Produits".

ProductId est la clé primaire de la table. Voici la ligne d'Index.cshtml

 @Html.ActionLink("Details", "Details","Products" , new  {  id=item.ProductId  },null)

0

ce code a fonctionné pour moi en vue partielle:

<a href="/Content/Index?SubCategoryId=@item.Id">@item.Title</a>

Bien que cela fonctionne, cela contourne tout l'intérêt d'utiliser ActionLink ... tout l'intérêt d'ActionLink est d'éviter de taper manuellement l'URL et les problèmes potentiels qui peuvent créer
Jon Story
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.