Verwenden von Html.ActionLink zum Aufrufen von Aktionen auf verschiedenen Controllern


224

Ich versuche mit zwischen Navigatoren zu navigieren ActionLink. Ich werde mein Problem anhand eines Beispiels erläutern.

Ich bin in der Indexansicht des Hat-Controllers und versuche, den folgenden Code zu verwenden, um einen Link zur Detailaktion des Produkt-Controllers zu erstellen.

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

Anstatt einen Link zu Details auf dem Produktcontroller zu erstellen, wird unter dem Hat-Controller ein Link zu den Details erstellt und am Ende ein Längenparameter angehängt:

Hat/Details/9?Length=7

HTML.ActionLinkAufgrund dieses Problems kann ich nicht zwischen Controllern wechseln. Ich werde es begrüßen, wenn Sie mich darauf hinweisen können, was ich falsch mache. Vielen Dank

PS: Ich verwende die Standardrouteneinstellung, die mit MVC geliefert wird

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

Antworten:


409

Was Sie wollen, ist diese Überlastung:

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

1
Können Sie erklären, warum diese besondere Überlastung funktioniert und Korki nicht? Wie wirkt sich das Setzen von htmlAttributes auf null auf das Routing des Links aus?
Derek Hunziker

35
Wenn Sie die anderen Parameter verwenden, wird davon ausgegangen, dass das dritte Argument die Routenwerte und das vierte Argument die HTML-Attribute sind. Durch Hinzufügen eines fünften Arguments wird die Methode gezwungen, die richtige Überladung zu verwenden. Blättern Sie in Intellisense durch die Überlastungen, und dies ist sinnvoller.
Banford

2
Die Überlastung von ActionLink ist wirklich ungeschickt. Der springende Punkt beim Akzeptieren eines 'Objekts routeValues' anstelle einer RouteValueCollection besteht darin, den Schreibaufwand zu reduzieren. Am Ende müssen Sie jedoch eine zusätzliche Null eingeben. Nicht intuitiv und kontraproduktiv ...
TiMoch

3
Ich stimme zu, die Überlastungsparameter sind schlecht ausgelegt. Ich dachte, es war für die längste Zeit ein Fehler. Ich musste wirklich zum neunten Mal auf die Intelligenz starren, um zu verstehen, dass ich die falsche Signatur verwendete
Bkwdesign

1
Für zukünftige Leser ist dies die richtige Überladung, wenn Sie auf dieses Problem stoßen und versuchen, einen CSS-Stil hinzuzufügen. @ Html.ActionLink ("MyText", "MyAction", "MyController", null, neu {@class = "myClass"})
granadaCoder

17

Mit diesen Parametern lösen Sie die falsche überladene Funktion / Methode aus.

Was hat bei mir funktioniert:

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

Es wird HtmlHelper.ActionLink ausgelöst (Zeichenfolge linkText, Zeichenfolge actionName, Zeichenfolge controllerName, Objekt routeValues, Objekt htmlAttributes).

Ich benutze MVC 4.

Cheerio!


2
Ihre Codezeile löst nicht die von Ihnen erwähnte Überladung aus, sondern HtmlHelper.ActionLink (Zeichenfolge linkText, Zeichenfolge actionName, Objekt routeValues, Objekt htmlAttributes). Dies ergibt das gleiche Ergebnis, das das OP zu vermeiden versuchte. Sie müssen einen zusätzlichen Nullparameter hinzufügen.
TiMoch

Danke TiMoch, hast du das verpasst?
Stephan Venter

12

Ich würde empfehlen, diese Helfer aus Gründen der Klarheit wie folgt mit benannten Parametern zu schreiben:

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

Ab 2019 ist diese Funktion von JetBrains in ReSharper implementiert. Es ist eigentlich sehr hilfreich für diesen Umstand.
Jamie

10

Wenn Sie die MVC Futures-Assembly greifen (was ich sehr empfehlen würde), können Sie beim Erstellen des ActionLink ein generisches Element und ein Lambda verwenden, um die Route zu erstellen:

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

Sie können die Futures-Assembly hier herunterladen : http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


Danke für den eigentlichen Link - habe versucht ihn zu finden!
Perhentian

1
Seien Sie vorsichtig damit, da es nicht in MVC2 enthalten ist. Der Grund dafür ist, dass Aktionen nicht unbedingt Methoden sind (denen ich zustimme, aber die Migration wird schwierig, da wir die generische Methode bereits seit einiger Zeit verwenden). Hier ist der vollständige Artikel darüber, warum es nicht in 2 aufbewahrt wurde: haacked.com/archive/2008/08/29/…
Stu

7

Sie treffen die Überlastung von ActionLink falsch. Versuchen Sie dies stattdessen.

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

6

Probieren Sie es aus, es funktioniert gut

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

3

Eine alternative Lösung wäre, das UrlHilfsobjekt zu verwenden, um das hrefAttribut eines <a>Tags wie folgt festzulegen:

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

1

Beachten Sie, dass Details eine Seite "Ansicht" im Ordner "Produkte" sind.

ProductId ist der Primärschlüssel der Tabelle. Hier ist die Zeile aus Index.cshtml

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

0

Dieser Code hat bei mir in Teilansicht funktioniert:

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

Während dies funktioniert, umgeht es den gesamten Punkt der Verwendung von ActionLink ... Der gesamte Punkt von ActionLink besteht darin, die manuelle Eingabe der URL und der potenziellen Probleme, die entstehen können, zu vermeiden
Jon Story
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.