Mantendo o ViewData entre as chamadas de renderização
-
05-07-2019 - |
Pergunta
Estou tornando um formulário de login comum usando html.renderaction, em todas as páginas do meu site.
Se o usuário inserir seus detalhes na caixa de texto e clicar em 'enviar', ele fará uma postagem para um controlador que lida com o login.
Se eles cometerem um erro, como inserir um endereço de email inválido, ele preencherá o ModelState com uma mensagem de erro e depois redirecionará a página em que estavam antes.
O problema é que, como a renderização ocorre como uma solicitação separada, estou perdendo o ViewModel.
Mesmo quando o coloquei em tempdata, ele se perde, já que o tempdata é liberado em cada solicitação separada.
Existe uma maneira de preservar os dados entre as chamadas consecutivas de HTML.RenderAction?
Caso contrário, alguma sugestão sobre como eu poderá invadir isso? (Deve colocar os dados em sessão?)
Solução
Aqui está o que eu fiz por enquanto. (Esta provavelmente não é a solução mais ideal.)
Criei um 'PreserveViewDataattribute', que eu coloquei em qualquer ação pela qual eu queira preservar o ViewData na sessão.
No meu controle de base, substituo o método 'redirecionamento' com meu próprio método, que faz o seguinte.
Recebe uma referência ao método de ação que o chamou (um pouco de reflexão aqui)
Verifica se este método tem o 'preserveViewDataattribute' definido nele
Se isso acontecer, copia o ViewData atual para uma variável de sessão. (O rótulo da variável é o mesmo que o nome de ação atual, com '_ViewData' preso no final.)
Em ambos os casos, chama o método de redirecionamento base.
Em seguida, criei uma propriedade no controlador de bases chamado 'PreservationViewData', que retorna o ViewData em sessão, relevante para a ação atual. (Ou retorna nulo, se não for encontrado).
Assim, para preservar o ViewData, desde que eu queira, só preciso decorar minha ação com 'preserveViewDataattribute' e depois chamar 'preserviveViewData' sempre que eu precisar.
Deixe-me saber se você deseja o código de origem para isso.
Outras dicas
Você pode gostar desta abordagem da seção pós-redirect-get de Kazi Rashid.
http://weblogs.asp.net/rashid/archive/2009/04/01/asp-nalm-mvc-best-practices-part-1.aspx#prg