2009-05-05 11 views
271

Estoy muy confundido en cuanto a por qué este códigoHtml.ActionLink rendir

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }) 

resultados en este enlace "Longitud = 4?":

<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a> 

La parte hidefocus es lo que yo pretendía lograr, pero ¿de dónde viene el ?Length=4?

+2

Este comportamiento también aparece con los métodos Html.BeginForm(). –

+3

Esto me ha estado volviendo loco la mayor parte del día. Estoy enormemente aliviado. – 5arx

Respuesta

292

La longitud = 4 proviene de un intento de serializar un objeto de cadena. Su código se ejecuta este método ActionLink:

public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes) 

Esto toma un string objeto "Inicio" para routeValues, que las búsquedas de plomería MVC para las propiedades públicas convirtiéndolos en valores de ruta. En el caso de un objeto string, la única propiedad pública es Length, y como no habrá rutas definidas con un parámetro de Longitud, agrega el nombre y el valor de la propiedad como un parámetro de cadena de consulta. Probablemente descubrirá que si ejecuta esto desde una página que no está en el HomeController arrojará un error sobre el método de acción About que falta. Trate de usar la siguiente:

Html.ActionLink("About", "About", new { controller = "Home" }, new { hidefocus = "hidefocus" }) 
+9

ver la respuesta por @jesse a continuación, tiene una mejor solución (en mi humilde opinión) – THBBFT

+0

@Blah_Blah en estos días no uso esto en absoluto, prefiero escribir mis propias etiquetas y simplemente usar Url.Action ("Acción" , "Controlador") – roryf

+0

@roryf no se preocupe ... esto se usó en una revisión de código como mejores prácticas, no revisaron la fecha. Realmente debería haber una manera de filtrar el stackoverflow por fecha ... – THBBFT

24

Los parámetros de ActionLink no son correctos, está intentando usar el valor "Inicio" como valor de ruta, en lugar del tipo anónimo.

Creo que solo necesita agregar new { } o null como último parámetro.

EDITAR: Simplemente volvió a leer la publicación y se dio cuenta de que probablemente desee especificar null como el segundo último parámetro, no el último.

+8

En mi humilde opinión Esto es SOOOO volviendo molesto. Me sucede 10 veces al día. – Jabe

+0

Cuéntame sobre eso. –

+1

BTW ¡Deben eliminar un método ya que no es posible usarlo! –

158

La forma en que resolví esto se añadía un valor nulo para el cuarto parámetro antes de la declaración anónima (new {}) para que utilice la siguiente sobrecarga del método: (linkText, actionName, controllerName, routeValues , htmlAttributes):

Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" }) 
+12

esta es la mejor respuesta para esto ... y debe marcarse como la respuesta. – MoXplod

+0

lo mismo para mí, gracias –

+0

Esta es la mejor respuesta si no estás enlazando Áreas. Si necesita especificar el área para el enlace, deberá especificar los valores de ruta con el 'controlador' y el' área' para evitar que la propiedad Longitud aparezca en la URL. –

2

Basta con retirar "Inicio" (nombre del controlador) para que el código sería:

Html.ActionLink("About", "About", new { hidefocus = "hidefocus" }) 
75

que se olvidó de añadir el HTMLAttribuye parm.

Esto funcionará sin ningún cambio:

Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null) 
+0

Gracias Jesse Rose, ¡ayudo! –

+1

¡+1 para este realmente funciona para mí! ¡Gracias! –

+0

Esto es lo que funcionó para mí –

0

Como Jonathon Watney señaló en un comentario, esto también va para

Html.BeginForm()

métodos. En mi caso, yo estaba en una Create.cshtml dirigidas a la solicitud POST del controlador correspondiente + Crear acción y tenía

using (Html.BeginForm("Create")) { 
    @Html.AntiForgeryToken() 
    ... 
} 

que se añadió la cadena de consulta "? Longitud = 6" a la acción de formulario cuando se procesaInsinuado por roryf de aprobados respuesta y la realización de la longitud de la cadena de "Crear" es 6, por fin he resuelto mediante la eliminación de la especificación acción explícita:

using (Html.BeginForm()) { 
     @Html.AntiForgeryToken() 
     ... 
    } 
5
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" }, new { }) 

Esto tomará la sobrecarga: cadena linkText, actionName cuerdas , controllerName cadena, routeValues ​​de objetos, objetos htmlAttributes

0

Con los nombres de atributos:

@Html.ActionLink(linkText: "SomeText", actionName: "SomeAction", controllerName: "SomeControllerName", routeValues: new { parameterName = parameterValue}, htmlAttributes: null) 
3

utilice amablemente derecho metanfetamina sobrecargada od con cinco (5) parámetros. Ejemplo:

@using (@Ajax.BeginForm("Register", "Account", null, 
    new AjaxOptions 
    { 
     HttpMethod = "POST", 
     OnSuccess = "OnSuccess", 
     OnFailure = "OnFailure", 
     OnBegin = "OnBegin", 
     OnComplete = "OnComplete" 
    }, new { @class = "form-login" })) 
+0

añadiendo ** null ** después de que el nombre del controlador fuera útil en mi caso. –

+0

Esta es efectivamente la misma respuesta que la respuesta de @ Jesse con la ventaja adicional de que cubre la versión de Ajax, que no es lo que solicitó el OP, pero está relacionada con el mismo problema. – gcoulby

Cuestiones relacionadas