Utilizzo di Html.ActionLink per richiamare azioni su controller diversi


224

Sto cercando di navigare tra i controller utilizzando ActionLink. Dirò il mio problema con un esempio.

Sono in visualizzazione indice del controller Hat e sto cercando di utilizzare il codice seguente per creare un collegamento all'azione Dettagli del controller del prodotto.

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

Invece di creare un collegamento a Dettagli sul controller del prodotto, questo genera un collegamento all'azione Dettagli sotto il controller Hat e aggiunge un parametro Lunghezza alla fine:

Hat/Details/9?Length=7

Non sono in grado di utilizzare HTML.ActionLinkper passare da un controller all'altro a causa di questo problema. Apprezzerò se puoi indicarmi cosa sto facendo di sbagliato. Grazie

PS: sto utilizzando l'impostazione di route predefinita fornita con MVC

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

Risposte:


409

Quello che vuoi è questo sovraccarico:

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

1
Puoi spiegare perché questo particolare sovraccarico funziona e Korki no? In che modo l'impostazione di htmlAttributes su null influisce sul routing del collegamento?
Derek Hunziker,

35
È perché se si utilizzano gli altri parametri si presuppone che il terzo argomento sia il routevalues ​​e il quarto argomento sia il htmlattributes. L'aggiunta di un quinto argomento impone al metodo di utilizzare il sovraccarico corretto. Scorri i sovraccarichi di intellisense e questo avrà più senso.
Banford,

2
Il sovraccarico di ActionLink è davvero maldestro. L'intero punto di accettare un 'oggetto routeValues' anziché un RouteValueCollection è ridurre la quantità di battitura. Tuttavia, si finisce per dover digitare un valore null aggiuntivo. Non intuitivo e controproducente ...
TiMoch,

3
Sono d'accordo, i parametri di sovraccarico sono mal progettati .. Ho pensato che fosse un bug per il tempo più lungo. Ho dovuto davvero fissare una nona volta l'intellisenso per capire che stavo usando la firma sbagliata
Bkwdesign,

1
Per i lettori futuri, se si verifica questo problema e si sta tentando di aggiungere uno stile CSS, questo è il sovraccarico corretto. @ Html.ActionLink ("MyText", "MyAction", "MyController", null, new {@class = "myClass"})
granadaCoder

17

Con questi parametri si attiva la funzione / metodo sovraccarico errato.

Cosa ha funzionato per me:

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

Genera HtmlHelper.ActionLink (string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)

Sto usando MVC 4.

Cheerio!


2
La tua riga di codice non attiva il sovraccarico menzionato ma HtmlHelper.ActionLink (string linkText, string actionName, object routeValues, object htmlAttributes). Questo produce lo stesso risultato che l'OP stava cercando di evitare. Devi aggiungere un ulteriore parametro null.
TiMoch,

Grazie TiMoch, hai perso quello?
Stephan Venter,

12

Consiglierei di scrivere questi helper usando parametri nominati per motivi di chiarezza come segue:

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

A partire dal 2019, questa funzione è implementata in ReSharper da JetBrains. In realtà è molto utile per questa circostanza.
Jamie,

10

Se prendi l'assembly Futures MVC (che consiglio vivamente) puoi usare un generico durante la creazione di ActionLink e un lambda per costruire il percorso:

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

È possibile ottenere l'assemblea dei futures qui: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


Grazie per l'effettivo link: stavo cercando di trovarlo!
Perhentian,

1
Attento a questo, tuttavia, poiché non è stato incluso in MVC2. Il ragionamento è che le azioni non sono necessariamente metodi (con cui sono d'accordo, ma sarà un problema migrare poiché stiamo usando il metodo generico da un po 'di tempo). Ecco l'articolo completo sul perché non è stato conservato in 2: haacked.com/archive/2008/08/29/…
Stu

7

Stai sbagliando nel sovraccarico di ActionLink. Prova questo invece.

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

6

provalo funziona bene

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

3

Una soluzione alternativa sarebbe quella di utilizzare l' Urloggetto helper per impostare l' hrefattributo di un <a>tag come:

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

1

Notare che Dettagli è una pagina "Visualizza" nella cartella "Prodotti".

ProductId è la chiave primaria della tabella. Ecco la riga da Index.cshtml

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

0

questo codice ha funzionato per me in vista parziale:

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

Mentre funziona, aggira l'intero punto di utilizzo di ActionLink ... l'intero punto di ActionLink è evitare di digitare manualmente l'URL e i potenziali problemi che possono creare
Jon Story
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.