Estou muito confuso sobre o porquê deste código
Html.ActionLink("About", "About", "Home", new { hidefocus = "hidefocus" })
resultados neste link:
<a hidefocus="hidefocus" href="/Home/About?Length=4">About</a>
A hidefocus
parte é o que eu pretendia alcançar, mas de onde ?Length=4
vem?
asp.net-mvc
My Alter Ego
fonte
fonte
Respostas:
O comprimento = 4 é proveniente de uma tentativa de serializar um objeto de seqüência de caracteres. Seu código está executando este
ActionLink
método:Isso leva um
string
objeto "Home" para routeValues, que o encanamento do MVC procura por propriedades públicas, transformando-os em valores de rota. No caso de umstring
objeto, a única propriedade pública éLength
e, como não haverá rotas definidas com um parâmetro Length, ele anexa o nome e o valor da propriedade como um parâmetro da string de consulta. Você provavelmente descobrirá que, se executar isso em uma página que não estáHomeController
nela, gera um erro sobre umAbout
método de ação ausente . Tente usar o seguinte:fonte
Url.Action()
. Alterar deUrl.Action("Action", "Controller", new { area = "" })
paraUrl.Action("Action", new { controller = "Controller", area = "" })
impede que a propriedade Length seja exibida.Html.ActionLink("About", "About", "Home", routeValues: null, htmlAttributes: new { hidefocus = "hidefocus" })
A maneira que resolvi isso foi adicionar um nulo ao quarto parâmetro antes da declaração anônima (
new {}
) para que ele use o seguinte método de sobrecarga: (linkText, actionName, controllerName, routeValues, htmlAttributes):fonte
controller
earea
para impedir que a propriedade Length apareça na URL.routeValues
mas apenas na área. Por exemplo:Html.ActionLink("About", "About", "Home", new {@area = "Admin"}, new { hidefocus = "hidefocus" })
ActionLink
, o MVC incluirá umLength=x
parâmetro estranho no final da URL. Por exemplo, coloque isso em uma página, depois veja a fonte da sua página e você verá o que quero dizer:@Html.ActionLink("About", "About", "Home", new { area = "Admin" }, new { hidefocus = "hidefocus" })
@Html.ActionLink("About", "About", "Home", new { area = "Admin" })
Mas se você inserir acontroller
entrada narouteValues
, ela nunca será inseridaLength=x
na URL.@
em@area = "Admin"
, só para você saber.Você esqueceu de adicionar o parm HTMLAttributes.
Isso funcionará sem nenhuma alteração:
fonte
Os parâmetros para o ActionLink não estão corretos, ele está tentando usar o valor "Inicial" como um valor de rota, em vez do tipo anônimo.
Eu acredito que você só precisa adicionar
new { }
ounull
como o último parâmetro.EDIT: basta reler a postagem e percebi que você provavelmente desejará especificar null como o segundo último parâmetro, não o último.
fonte
Isso exigirá a sobrecarga: string linkText, string actionName, string controllerName, Object routeValues, Object htmlAttributes
fonte
Por favor, use o método sobrecarregado à direita com cinco (5) parâmetros. Exemplo:
fonte
Apenas remova "Home" (nome do controlador) para que o código seja:
fonte
Com nomes de atributo:
fonte
Como Jonathon Watney apontou em um comentário, isso também vale para
métodos. No meu caso, eu estava em um Create.cshtml visando a solicitação de postagem do controlador correspondente + ação Create e tinha
que estava adicionando a querystring "? Length = 6" à ação do formulário quando renderizada. Sugerido pela resposta aprovada por roryf e percebendo que o comprimento da string de "Create" é 6, finalmente resolvi isso removendo a especificação de ação explícita:
fonte
Talvez outros tenham o mesmo problema e precisem fornecer um valor de classe via HTMLAttributes parm. Aqui está a minha solução:
fonte
Procurar uma resposta para minha pergunta me levou até aqui, basicamente é a seleção da sobrecarga correta
@Html.ActionLink
que interessa.Eu estava selecionando uma sobrecarga que não existia ( sem a última
null
) eMVC
não tinha essa sobrecarga, resultando em uma URL falsa, algo como o OP mencionado.Uma observação pessoal : você pode
use
tipos anônimos não significa que você pode usar qualquer uma das sobrecargas - que não existem? - tornar certa: ele tem de ser definido!- Vim aqui em tempos de MVC 5.2
fonte