Estoy MUY confundido en cuanto a por qué este código
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
resultados en este enlace:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
La hidefocus
parte es lo que pretendía lograr, pero ¿de dónde ?Length=4
viene?
asp.net-mvc
Mi alter ego
fuente
fuente
Respuestas:
La longitud = 4 proviene de un intento de serializar un objeto de cadena. Su código está ejecutando este
ActionLink
método:Esto toma un
string
objeto "Inicio" para routeValues, que la plomería MVC busca propiedades públicas convirtiéndolas en valores de ruta. En el caso de unstring
objeto, la única propiedad pública esLength
, y dado que no habrá rutas definidas con un parámetro Longitud, agrega el nombre y el valor de la propiedad como un parámetro de cadena de consulta. Probablemente encontrará que si ejecuta esto desde una página que no está enHomeController
él, arrojará un error sobre unAbout
método de acción faltante . Intenta usar lo siguiente:fuente
Url.Action()
. Cambiar deUrl.Action("Action", "Controller", new { area = "" })
aUrl.Action("Action", new { controller = "Controller", area = "" })
evita que se muestre la propiedad Longitud.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
La forma en que resolví esto fue agregando un valor nulo al cuarto parámetro antes de la declaración anónima (
new {}
) para que use la siguiente sobrecarga de método: (linkText, actionName, controllerName, routeValues, htmlAttributes):fuente
controller
yarea
para evitar que la propiedad Longitud se muestre en la URL.routeValues
sino solo en ella. Por ejemplo:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, MVC incluirá unLength=x
parámetro extraño al final de la URL. Por ejemplo, coloque esto en una página, luego vea la fuente de su página y verá lo que quiero decir:@Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
pero si coloca lacontroller
entrada enrouteValues
, nunca se colocaráLength=x
en la URL.@
en@area = "Admin"
, para que lo sepas.Olvidó agregar el parámetro HTMLAttributes.
Esto funcionará sin ningún cambio:
fuente
Los parámetros para ActionLink no son correctos, está intentando utilizar el valor "Inicio" como valor de ruta, en lugar del tipo anónimo.
Creo que solo necesita agregar
new { }
onull
como último parámetro.EDITAR: solo vuelva a leer la publicación y se dio cuenta de que probablemente querrá especificar nulo como el segundo último parámetro, no el último.
fuente
Esto tomará la sobrecarga: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
fuente
Utilice amablemente el método sobrecargado correcto con cinco (5) parámetros. Ejemplo:
fuente
Simplemente elimine "Inicio" (nombre del controlador) para que el código sea:
fuente
Con nombres de atributos:
fuente
Como Jonathon Watney señaló en un comentario, esto también se aplica a
métodos. En mi caso, estaba en un Create.cshtml dirigido a la solicitud posterior del controlador correspondiente + Crear acción y tenía
que agregaba la cadena de consulta "? Longitud = 6" a la acción del formulario cuando se procesaba. Insinuado por la respuesta aprobada de roryf y al darme cuenta de que la longitud de la cadena de "Crear" es 6, finalmente resolví esto eliminando la especificación de acción explícita:
fuente
Quizás otros tuvieron el mismo problema y necesitan proporcionar un valor de clase a través de HTMLAttributes parm. Aquí está mi solución:
fuente
Buscar una respuesta a mi pregunta me trajo aquí, básicamente lo
@Html.ActionLink
que importa es la selección de la sobrecarga correcta .Estaba seleccionando una sobrecarga que no existía ( sin la última
null
), yMVC
no tenía tal sobrecarga, lo que resultó en una URL falsa similar a la OP mencionada.Una nota personal : ¿puede
use
tipos anónimos no significa que puede usar cualquiera de las sobrecargas, que no existen? - asegurarse de que: se tiene que definirse!- Vine aquí en tiempos de MVC 5.2
fuente