¿Por qué Html.ActionLink representa “? Length = 4”

Estoy MUY confundido sobre por qué este código

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

resultados en este enlace:

 About 

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

La longitud = 4 proviene de un bash de serializar un objeto de cadena. Su código está ejecutando este método ActionLink :

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

Esto toma un objeto de string “Inicio” para routeValues, que la plomería MVC busca propiedades públicas convirtiéndolas en valores de ruta. En el caso de un objeto de 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 HomeController arrojará un error acerca de un método de acción que falta. Intenta usar lo siguiente:

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

La forma en que resolví esto fue agregar un nulo al cuarto parámetro antes de la statement anónima ( new {} ) para que use la sobrecarga de método siguiente: (linkText, actionName, controllerName, routeValues, htmlAttributes):

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

Olvidó agregar el parm HTMLAttributes.

Esto funcionará sin ningún cambio:

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

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 el último parámetro.

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

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

Esto tomará la sobrecarga: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes

Utilice amablemente el método sobrecargado 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" })) 

Simplemente elimine “Inicio” (nombre del controlador) para que el código sea:

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

Con nombres de atributos:

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

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

Html.BeginForm ()

métodos. En mi caso, estaba en un Create.cshtml que apuntaba a la solicitud de publicación del controlador correspondiente + Crear acción y tenía

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

que agregaba la cadena de consulta “? Length = 6” a la acción del formulario cuando se procesaba. Insinuado por la respuesta aprobada de roryf y dándome cuenta de que la longitud de cadena de “Crear” es 6, finalmente resolví esto eliminando la especificación de acción explícita:

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

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:

 @Html.ActionLink("About", "About", new { controller = "Home", area = "" }, new { hidefocus = "hidefocus", @class = "nav-item nav-link" })