Usando Html.ActionLink para llamar a la acción en un controlador diferente


224

Estoy tratando de navegar entre controladores usando ActionLink. Diré mi problema con un ejemplo.

Estoy en la vista de índice del controlador Hat, y estoy tratando de usar el siguiente código para crear un enlace a la acción Detalles del controlador del producto.

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

En lugar de crear un enlace a Detalles en el controlador del Producto, esto genera un enlace a la acción Detalles en el controlador Hat y agrega un parámetro de Longitud al final del mismo:

Hat/Details/9?Length=7

No puedo usar HTML.ActionLinkpara cambiar entre controladores debido a este problema. Le agradeceré si me puede señalar lo que estoy haciendo mal. Gracias

PD: estoy usando la configuración de ruta predeterminada que viene con MVC

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

Respuestas:


409

Lo que quieres es esta sobrecarga:

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

1
¿Puede explicar por qué esta sobrecarga en particular funciona y la de Korki no? ¿Cómo afecta la configuración de htmlAttributes a nulo en el enrutamiento del enlace?
Derek Hunziker

35
Es porque si usa los otros parámetros, supone que el tercer argumento son los valores de ruta y el cuarto argumento son los atributos htmlattributes. Agregar un quinto argumento obliga al método a usar la sobrecarga correcta. Hojee las sobrecargas en intellisense y esto tendrá más sentido.
Banford

2
La sobrecarga de ActionLink es realmente torpe. El objetivo de aceptar un 'objeto routeValues' en lugar de una RouteValueCollection es reducir la cantidad de tipeo. Sin embargo, terminas teniendo que escribir un nulo adicional. No intuitivo y contraproducente ...
TiMoch

3
Estoy de acuerdo, los parámetros de sobrecarga están mal diseñados ... Pensé que era un error durante mucho tiempo. Realmente tuve que mirar por novena vez a todos los inteligentes para entender que estaba usando la firma incorrecta
Bkwdesign

1
Para futuros lectores, si se topa con este problema y está tratando de agregar un estilo CSS, esta es la sobrecarga correcta. @ Html.ActionLink ("MyText", "MyAction", "MyController", nulo, nuevo {@class = "myClass"})
granadaCoder

17

Con esos parámetros, está activando la función / método sobrecargado incorrecto.

Lo que funcionó para mí:

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

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

Estoy usando MVC 4.

Cheerio!


2
Su línea de código no activa la sobrecarga que menciona, sino HtmlHelper.ActionLink (string linkText, string actionName, object routeValues, object htmlAttributes). Esto produce el mismo resultado que el OP estaba tratando de evitar. Necesita agregar un parámetro nulo adicional.
TiMoch

Gracias TiMoch, ¿te perdiste esa?
Stephan Venter

12

Recomendaría escribir estos ayudantes usando parámetros con nombre por razones de claridad de la siguiente manera:

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

A partir de 2019, esta característica se implementa en ReSharper por JetBrains. En realidad es muy útil para esta circunstancia.
Jamie

10

Si toma el ensamblaje MVC Futures (que recomiendo encarecidamente), puede usar un genérico al crear ActionLink y una lambda para construir la ruta:

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

Puede obtener el ensamblaje de futuros aquí: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471


Gracias por el enlace real, ¡estaba tratando de encontrarlo!
Perhentian

1
Tenga cuidado con esto, ya que no se ha incluido en MVC2. El razonamiento es que las acciones no son necesariamente métodos (con lo que estoy de acuerdo, pero será difícil migrar ya que hemos estado usando el método genérico durante un tiempo). Aquí está el artículo completo sobre por qué no se ha mantenido en 2: haacked.com/archive/2008/08/29/…
Stu

7

Estás golpeando mal la sobrecarga de ActionLink. Intenta esto en su lugar.

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

6

pruébalo está funcionando bien

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

3

Una solución alternativa sería utilizar el Urlobjeto auxiliar para establecer el hrefatributo de una <a>etiqueta como:

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

1

Tenga en cuenta que Detalles es una página "Ver" en la carpeta "Productos".

ProductId es la clave principal de la tabla. Aquí está la línea de Index.cshtml

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

0

este código funcionó para mí en vista parcial:

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

Si bien esto funciona, evita todo el punto de usar ActionLink ... todo el punto de ActionLink es evitar escribir manualmente la URL y los posibles problemas que pueden crearse
Jon Story
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.