¿Por qué Html.ActionLink representa "? Longitud = 4"
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 viene ?Length=4
?
La Longitud = 4 proviene de un intento de serializar un objeto de cadena. Su código ejecuta este ActionLink
método:
public static string ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes)
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 un string
objeto, la única propiedad pública es Length
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á en ella, HomeController
se generará un error sobre un About
método de acción faltante. Intente usar lo siguiente:
Html.ActionLink("About", "About", new { controller = "Home" }, 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 el siguiente método de sobrecarga: (texto de enlace, nombre de acción, nombre de controlador, valores de ruta, atributos html):
Html.ActionLink("About", "About", "Home", null, new { hidefocus = "hidefocus" })
Olvidó agregar el parámetro HTMLAttributes.
Esto funcionará sin ningún cambio:
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" },null)