Um problema simples e muitas dores de cabeça!
Recentemente estive a trabalhar num problema no mínimo inquietante. Tratava-se de uma funcionalidade AJAX que permitia adicionar linhas a uma tabela que era refrescada dinamicamente em função dos dados inseridos num post AJAX.
O request tinha este aspecto:
new Ajax.Request('$UrlHelper.For("%{action='addRow'}")',
{
method: 'get',
parameters:Form.serialize('CFNew'),
onSuccess: RefreshTable,
onFailure: showErrorMessage
});
O pedido saía do cliente correctamente e atingia o servidor que efectuava uma operação e devolvia uma tabela HTML que era refrescada na função RefreshTable. E tudo funcionava bem até que cheguei aos testes com o IE. No Firefox, Opera, Chrome e Safari tudo corria às mil e uma maravilhas no IE, o primeiro pedido era correctamente efectuado ños seguintes não acontecia nada (caso enviasse os mesmo dados no request).
Tratava-se de um problema de cache, os pedidos HTTP circulavam correctamente em qualquer browser, mas no IE as coisas estavam completamente paradas. Uma limpeza de cache e o pedido seguia com sucesso, novamente os seguintes ficavam bloqueados. Implementadas todas as técnicas ao nível do servidor ao nível dos cabeçalhos do protocolo HTTP já não me ocorria nada até que … se fez luz!
Para garantir (pelo menos tentar) que cada pedido era distinto do anterior bastou adicionar um campo hidden no formulário e preenchê-lo com um valor dummy, por exemplo a data actual no cliente. No formulário acrescentei então um campo hidden RTP (de RequestTimeStamp) e no script que faz o request preencho-o com a data:
$('RTP').value = new Date().getTime();
new Ajax.Request('$UrlHelper.For("%{action='addRow'}")',
{
method: 'get',
parameters:Form.serialize('CFNew'),
onSuccess: RefreshTable,
onFailure: showErrorMessage
});
Agora mesmo que se façam 2 pedidos com os mesmos dados há sempre um valor que difere e a cache no IE deixa de actuar.
terça-feira, 30 de junho de 2009
Subscrever:
Enviar feedback (Atom)

Sem comentários:
Enviar um comentário