Por que o Html.ActionLink renderiza “? Length = 4”

Estou muito confuso sobre por que esse código

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

resultados neste link:

 About 

A parte do hidefocus é o que eu pretendia alcançar, mas de onde vem o ?Length=4 ?

O Length = 4 é proveniente de uma tentativa de serializar um object de string. Seu código está executando este método ActionLink :

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

Isso leva um object de string “Home” para routeValues, que o encanamento MVC procura por propriedades públicas transformando-as em valores de rota. No caso de um object string , a única propriedade pública é Length e, como não haverá rotas definidas com um parâmetro Length, ele anexa o nome da propriedade e o valor como um parâmetro de string de consulta. Você provavelmente descobrirá se você executar isso a partir de uma página que não esteja no HomeController ele lançará um erro sobre um método de ação About . Tente usar o seguinte:

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

A maneira como resolvi isso foi adicionando um nulo ao quarto parâmetro antes da declaração anônima ( new {} ) para que ele usasse a seguinte sobrecarga de método: (linkText, actionName, controllerName, routeValues, htmlAttributes):

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

Você esqueceu de adicionar o parm de HTMLAttributes.

Isso funcionará sem alterações:

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

Os parâmetros para ActionLink não estão corretos, ele está tentando usar o valor “Home” como um valor de rota, em vez do tipo anônimo.

Eu acredito que você só precisa adicionar um new { } ou null como o último parâmetro.

EDIT: Apenas reler o post e percebi que você provavelmente deseja especificar nulo como o segundo último parâmetro, não o último.

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

Isso levará a sobrecarga: string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes

Por favor, use o método correto sobrecarregado com cinco (5) parâmetros. Exemplo:

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

Basta remover “Home” (nome do controlador) para que o código seja:

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

Com nomes de atributos:

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

Como Jonathon Watney apontou em um comentário, isso também vale para

Html.BeginForm ()

methods. No meu caso, eu estava em um Create.cshtml visando a solicitação de post do controller correspondente + Create action e tinha

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

que estava adicionando a querystring “? Length = 6” à ação do formulário quando renderizada. Sugerido pela resposta aprovada do roryf e percebendo que o comprimento da string de “Create” é 6, eu finalmente resolvi isso removendo a especificação de ação explícita:

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

Talvez outros tenham o mesmo problema e precisem fornecer um valor de class via HTMLAtributes parm. Aqui está minha solução:

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