2009-04-22 27 views
192

Estoy intentando navegar entre los controladores usando ActionLink. Diré mi problema con un ejemplo.Usar Html.ActionLink para llamar a la acción en un controlador diferente

Estoy en la vista de índice del controlador Hat, y estoy tratando de usar el código siguiente 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 vínculo con detalles en el controlador del producto, esto genera un enlace a Detalles acción bajo la supervisión del sombrero y agrega un parámetro de longitud al final de la misma:

Hat/Details/9?Length=7 

no soy capaz para usar HTML.ActionLink para cambiar entre los controladores debido a este problema. Apreciaré si me puedes señalar lo que estoy haciendo mal. Gracias

PS: Estoy utilizando la configuración de ruta por defecto que viene con MVC

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

Respuesta

353

Lo que queremos 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 Korki no? ¿Cómo afecta htmlAttributes a null afectar el enrutamiento del enlace? –

+1

@Derek Hunziker, Simplemente los argumentos son diferentes para la sobrecarga de Korki. –

+29

Es porque si usa los otros parámetros, asume que el tercer argumento es los valores de ruta y el 4to argumento es el htmlattributes. Agregar un quinto argumento obliga al método a usar la sobrecarga correcta. Examine las sobrecargas en intellisense y esto tendrá más sentido. – Banford

6

que está golpeando el mal la sobrecarga de ActionLink. Prueba esto en su lugar.

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

Si agarras el conjunto MVC Futuros (que recomiendo encarecidamente) a continuación, puede utilizar un genérico al crear el ActionLink y una lambda para construir la ruta:

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

Usted puede obtener el Los futuros del montaje aquí: http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471

+0

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

+1

Ten 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 va a ser un dolor para migrar ya que hemos estado usando el método genérico desde hace un tiempo). Aquí está el artículo completo sobre por qué no se ha guardado en 2: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx – Stu

4

probarlo se está trabajando muy bien

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

Con que los parámetros que está desencadenando la función/método sobrecargado mal.

Lo que funcionó para mí:

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

Se dispara HtmlHelper.ActionLink (linkText cadena, actionName cadena, cadena controllerName, routeValues ​​de objetos, objetos htmlAttributes)

estoy usando MVC 4.

Cheerio!

+2

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

+0

Gracias TiMoch, ¿te lo perdiste? –

2

Una solución alternativa sería utilizar el objeto Url ayudante para establecer el atributo href de un <a> etiqueta como:

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

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

<a href="/Content/[email protected]">@item.Title</a> 
4

I recomendaría escribir estos ayudantes usando los parámetros nombrados en aras de la claridad de la siguiente manera:

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