domingo, 20 de abril de 2008

Encoding em Update Panel

    Esta semana me deparei com um problema de resolução bem simples, mas que pode tirar uma pessoa do sério ao utilizar o update panel do ASP.NET AJAX.
    Por motivo de compatilidade com nosso conjunto de caracteres, na empresa onde trabalho costumamos criar os aplicativos ASP.NET e definir os encodings sempre para iso-8859-1 no web.config:

<system.web>
    <globalization fileEncoding="iso-8859-1" responseEncoding="iso-8859-1" requestEncoding="iso-8859-1" uiCulture="pt-BR" />
[...]
</system.web>


    Tudo funcionava muito bem, pois não tinhamos o custume de usar AJAX.
De um tempo pra cá, entramos na onda Web 2.0, onde tudo é interativo, tudo é AJAX.
    Nesta semana que passou uma desenvolvedora estava testando novas tecnologias em seus projetos, entre as quais utilizando o que podemos chamar de "AJAX Express", o Update Panel. Explico: a grosso modo, o Update Panel não exige nenhuma grande mudança nas páginas, você joga um update panel e a página vira AJAX. Mas esta facilidade tem seu custo. Toda vez que você atualiza a página no update panel, todo o viewstate trafega junto e em uma página complexa isto realmente é um grande tráfego. Mas meios mais eficientes serão tema de um futuro post.
    Voltando ao que interessa. Quando minha colega tentou recuperar os valores de um TextBox, os caracteres especiais não vinham corretamente, aquele valor não era utilizável. Depois de deixá-la procurando uma solução sozinha por algum tempo, aproximei-me para ver o que estava acontecendo. Depois de algumas tentativas, percebi que o textbox estava dentro de um update panel e isto fazia toda a diferença. Pedi para ver o web.config do aplicativo e foi onde lembrei que também já passei por este problema. O update panel ignora o encoding do webconfig e tenta ler tudo como UTF-8. Isto me parece um bug, mas não procurei a fundo o motivo (talvez exista um). Mudamos o web.config para:

<system.web>
    <globalization fileEncoding="iso-8859-1" responseEncoding="utf-8" requestEncoding="utf-8" uiCulture="pt-BR" />
[...]
</system.web>


    Aí tudo correu bem!
    Resumo da história: se você for utilizar update panels em seu aplicativo, lembre-se de sempre definir responseEnconding e requestEncoding como UTF-8.
    Mas dê uma olhada em PageMethods. É bem mais trabalhoso de utilizar, mas tanto o tamanho das respostas quanto a agilidade na atualização da página são muito melhores. Mas vão precisar que você tenha um bom conhecimento de JavaScript.

Abraços e até a próxima!

3 comentários:

Jader Dias disse...

Salve mestre Sandro!
Nunca me esquecerei deste POST! Essencial!

Comstock disse...

Sobre problemas ao executar alguma ação dentro de uma página com um UpdatePanel e diversos controles, como por exemplo no meu caso, "trava o browser" durante aprox. uns 30 seg.
Retirando o updatepanel funciona belezinha....
Já passou por isto ?

Anônimo disse...

Vc tinha que trabalhar com o Obama.
vc conhece muito. \m/