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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top