Pergunta

Estou com um problema ao manter o estado em uma página ASP.NET AJAX.Versão curta:Preciso atualizar a página ViewState após um retorno de chamada assíncrono, para refletir quaisquer alterações de estado feitas pelo servidor durante a chamada assíncrona.

Este parece ser um problema comum, mas descreverei meu cenário para ajudar a explicar:

Eu tenho um controle semelhante a uma grade que possui alguns aprimoramentos de JavaScript - ou seja, a capacidade de arrastar e soltar colunas e linhas.Quando uma coluna ou linha é colocada em uma nova posição, um método AJAX é invocado para notificar o controle do lado do servidor e disparar um evento correspondente do lado do servidor ("OnColumnMoved" ou "OnRowMoved").

As chamadas ASP.NET AJAX, por padrão, enviam a página inteira como solicitação.Dessa forma, a página passa por um ciclo de vida completo, o viewstate é persistido e o estado do controle é restaurado antes que o método RaiseCallbackEvent seja invocado.

Entretanto, como a chamada AJAX não atualiza a página, o ViewState reflete o original estado do controle, mesmo após a coluna ou linha ter sido movida.Portanto, na segunda vez que ocorre uma ação do lado do cliente, a solicitação AJAX vai para o servidor e a página e o controle são criados novamente para refletir o primeiro estado do controle, não o estado após a primeira coluna ou linha ter sido movida.

Este problema se estende a muitas implicações.Por exemplo, se tivermos uma ação do lado do cliente/AJAX para adicionar um novo item à grade e, em seguida, uma linha for arrastada, a grade será construída no lado do servidor com um item a menos do que no lado do cliente.

E, finalmente, e mais seriamente, para meu exemplo específico, o objeto de fonte de dados real sobre o qual estamos agindo é armazenado na página ViewState.Essa foi uma decisão de design para permitir manter uma cópia com estado dos dados manipulados, que pode ser confirmada no banco de dados após muitas manipulações ou descartada se o usuário desistir.Isso é muito difícil de mudar.

Então, novamente, preciso de uma maneira de atualizar a página ViewState no retorno de chamada após o método AJAX ser acionado.

Foi útil?

Solução

Se você já está embaralhando o ViewState de qualquer maneira, é melhor usar um UpdatePanel.Seus postbacks parciais vai atualize o ViewState da página automaticamente.

Outras dicas

Confira esta postagem do blog: Ajustando o ICallbackEventHandler e o Viewstate.O autor parece estar abordando a mesma situação que você está enfrentando:

Portanto, ao usar ICallbackEventHandler você terá dois obstáculos a superar para ter um gerenciamento de estado atualizado para retornos de chamada.O primeiro é o problema do estado de visualização somente leitura.A outra é registrar as alterações que o usuário fez na página antes de acionar o retorno de chamada.

Veja a postagem do blog para sugestões sobre como resolver isso.Confira também isso postagem no fórum que também discute o mesmo problema.

Na verdade, encontrei os dois links que você forneceu, mas, como observado, eles estão simplesmente descrevendo o problema, não o resolvendo.O autor da postagem do blog sugere uma solução alternativa usando um provedor ViewState diferente, mas infelizmente isso não é uma possibilidade neste caso... Eu realmente preciso deixar os detalhes do ViewState de lado e apenas me concentrar no que está sendo feito sai da caixa.

Eu encontrei uma solução bastante elegante com RadAjaxManager da Telerik.Funciona muito bem, essencialmente, você registra cada controle que pode invocar um postback e, em seguida, registra cada controle que deve ser redesenhado após o postback ser executado de forma assíncrona.O RadAjaxManager atualizará o DOM após o postback assíncrono e reescreverá o ViewState e todos os controles afetados.Depois de dar uma olhada no Reflector, ele parece um pouco desajeitado por baixo do capô, mas atende aos meus propósitos.

Não entendo por que você usaria um controle personalizado para isso, quando o ASP.NET AJAX UpdatePanel integrado faz a mesma coisa.

Isso apenas adiciona mais complexidade, oferece menos suporte e torna mais difícil para outras pessoas trabalharem em seu aplicativo.

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