Pergunta

Estou usando uma versão mais antiga do ASP.NET AJAX devido a limitações de tempo de execução. Colocar um validador ASP.NET dentro de um painel de atualização não funciona.Existe um truque para fazer isso funcionar ou preciso usar o controle ValidatorCallOut que vem com o kit de ferramentas AJAX?

Foi útil?

Solução

Suspeito que você esteja executando a versão original (RTM) do .NET 2.0.

Até o início de 2007, os controles validadores não eram compatíveis com UpdatePanels.Isso foi resolvido com o SP1 do .NET Framework.

A origem do problema é que o UpdatePanel pode detectar alterações de marcação na sua página, mas não tem como rastrear os scripts corretamente.Os validadores dependem muito de scripts.Durante um postback parcial, os scripts são destruídos, não são atualizados ou não são executados quando deveriam.

Nos primeiros betas, a MS fez com que o UpdatePanel tentasse adivinhar quais scripts precisavam ser renderizados novamente ou executados.Não funcionou muito bem e eles tiveram que retirá-lo.

Para contornar o problema imediato, a Microsoft lançou uma versão corrigida das classes validadoras em uma nova DLL chamada Validators.DLL e deu instruções sobre como dizer ao ASP.NET para usar essas classes em vez das reais.Se você pesquisar esse nome de DLL no Google, deverá encontrar mais informações.Veja também Esta postagem do blog.

Esta foi uma medida provisória e você deveria não use isso evite-o se possível.

A verdadeira solução para o problema veio logo depois, no .NET 2.0 SP1.A Microsoft introduziu um novo mecanismo para registrar scripts no SP1 e alterou as classes validadoras reais para usar esse mecanismo em vez do antigo.

Deixe-me dar alguns detalhes sobre as mudanças:

Tradicionalmente, você deveria registrar scripts por meio de métodos Page como Page.RegisterStartupScript() e Page.RegisterClientScriptBlock().O problema é que esses métodos não foram projetados para serem extensíveis e o UpdatePanel não tinha como monitorar essas chamadas.

No SP1 há um novo objeto de propriedade na página chamado Page.ClientScripts.Este objeto possui métodos para registrar scripts que são equivalentes (e em alguns aspectos melhores) aos originais.Além disso, UpdatePanel pode monitorar essas chamadas, para que ele renderize novamente ou chame os métodos quando apropriado.O antigo RegisterStartupScript(), etc.métodos foram descontinuados.Eles ainda funcionam, mas não dentro de um UpdatePanel.

Não há razão (além da política, suponho) para não atualizar suas instalações para o .NET 2.0 SP1.Os Service Packs trazem correções importantes.

Boa sorte.

Outras dicas

@Jonathan Holanda:O que há de errado em usar Validators.dll?

Como elas substituem as classes originais, você está ignorando silenciosamente quaisquer bugs e correções de segurança, melhorias, etc.que a Microsoft poderá lançar no futuro (ou que já tenha lançado).A menos que você observe atentamente o web.config, talvez nunca perceba que está ignorando os patches.

Claro, você tem que avaliar cada situação.Se você está absolutamente preso ao .NET 2.0 RTM, então Validators.dll é melhor que nada.

@jmein

Na verdade, o problema é que os scripts do cliente Validator não funcionam quando colocados dentro de um updatePanel (UpdatePanels é atualizado usando .innerHTML, que adiciona os nós de script como nós de texto, não como nós de script, para que o navegador não os execute).

A correção foi um patch lançado pela Microsoft que corrige esse problema.Encontrei com a ajuda do Google.

http://blogs.msdn.com/mattgi/archive/2007/01/23/asp-net-ajax-validators.aspx

Se por algum motivo você não conseguir usar a versão atualizada dos controles do validador ASP.NET, é realmente muito fácil validar um grupo de validação sozinho, tudo o que você precisa fazer é chamar

Page_ClientValidate("validationGroupName");

Então você pode usar o PageRequestManager para executar a validação conforme necessário.

Definitivamente, usar os controles de validação atualizados é o caminho a percorrer, mas sou bastante parcial em relação ao JavaScript;)

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