ActionLink falhar com parâmetro ViewData em ASP.NET MVC Beta
-
03-07-2019 - |
Pergunta
Eu corri em um problema estranho com o método ActionLink em ASP.NET MVC Beta. Ao usar a sobrecarga Lambda dos futuros MVC eu não consigo especificar um parâmetro retirado ViewData.
Quando eu tente o seguinte:
<%= Html.ActionLink<PhotoController>(p => p.Upload(((string)ViewData["groupName"])), "upload new photo") %>
O HTML contém um link com um URL vazio.
<a href="">upload new photo</a>
No entanto, se eu codificar o parâmetro, como este:
<%= Html.ActionLink<PhotoController>(p => p.Upload("groupA"), "upload new photo") %>
A saída contém um URL real.
<a href="/group/groupA/Photo/Upload">upload new photo</a>
Eu suponho que este provavelmente tem algo a ver com a visibilidade e disponibilidade da ViewData, e não estar lá quando a Lambda fica avaliada pelos internos do framework. Mas isso é apenas um palpite.
Estou fazendo algo incorreto na primeira amostra para causar isso, ou isso é alguma falta de bug?
Atualizar : Eu estou usando a versão mais recente dos futuros MVC. Tem sido apontado que isso funciona para algumas pessoas. Uma vez que não funciona para mim isso me faz pensar que é algo específico para o que estou fazendo. Alguém tem alguma sugestão para o que olhar seguinte, porque este realmente tem me perplexo.
Solução 2
Ok, eu descobri que o meu problema era.
Aparentemente eu não estava mesmo a criação do slot ViewData que eu estava tentando ler a partir do ponto de vista, resultando em ele ser um valor nulo.
Então, efetivamente eu estava escrevendo:
<%= Html.ActionLink<PhotoController>(p => p.Upload(null), "upload new photo") %>
Eu acho que o kicker final para essa coisa toda foi o fato de que o parâmetro (groupname) representa um valor não inadimplir em minha tabela de roteamento.
routes.MapRoute(
"Group",
"group/{groupname}/{controller}/{action}/{id}",
new {controller = "Photos", action = "View", Id = ""});
Assim, de acordo com a regra de roteamento a propriedade groupname tem de estar presente, mas de acordo VAI À gropname Lambda foi omitido (null). Isto resultou no framework MVC ser incapaz de encontrar uma rota que satisfizesse minha consulta, e apenas retornando null.
Outras dicas
Você atualizou sua versão do Microsoft.Web.Mvc.dll onde o fortemente tipado reside actionlink.
Aparentemente, esta dll foi atualizado para a versão beta. A função pode ter sido ligeiramente modificada.
Eu apenas tentei este
<%= Html.ActionLink<HomeController>(x=>x.Search((string)ViewData["search"]), "search?") %>
e funcionou muito bem.