Introdução: Anthem é uma estrutura Ajax útil que oferece suporte a ASP.NET 1.1, 2.0.
Como todos os controles nesta estrutura herdam dos próprios controles de servidor do ASP.NET, quase todas as propriedades e comportamentos desses controles são mantidos (exceto para alterar seu PostBack para a chamada sem atualização do CallBack). Portanto, a curva de aprendizado é muito suave.
Hoje encontrei um problema de depuração problemático ao usar o Anthem, que está registrado aqui.
No código abaixo, eu uso um controle Anthem.Repeater.
<asp:XmlDataSource ID="XmlDataSource2" runat="servidor" XPath="//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<table class="minhatabela" width="100%" cellpacing="0" cellpadding="0">
<anthem:Repeater ID="rptNeedDocs" runat="servidor" DataSourceID="XmlDataSource2"
AutoUpdateAfterCallBack="Falso">
<HeaderTemplate>
<tr class="formTitle">
<td>
Selecione</td>
<td>
Nomes de arquivos e desenhos</td>
<td>
Deve ser enviado</td>
<td>
É original?</td>
<td>
Observações</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:CheckBox ID="chkDoc" runat="servidor" Checked="True" />
<asp:HiddenField ID="hidDocId" runat="servidor" Value='<%# XPath("@Id") %>' />
</td>
<td>
<asp:Label ID="lblDocName" runat="servidor" Text='<%# XPath("@Nome") %>' />
</td>
<td>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# XPath("@Quantity") %>' Width="30" />
</td>
<td>
<asp:RadioButtonList ID="radiolist_IsOriginal" runat="server" SelectedValue='<%# XPath("@IsOriginal") %>'
RepeatDirection="Horizontal">
<asp:ListItem Value="True">Original</asp:ListItem>
<asp:ListItem Value="False">Copiar</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<Modelo de rodapé>
</FooterTemplate>
</hino:Repetidor>
</tabela>
Quando esse código é executado, às vezes ocorre um erro JS: "Erro de tempo de execução desconhecido".
E esse erro só ocorre em situações específicas e é normal em outras situações semelhantes.
Felizmente, o VS 2005 oferece recursos muito poderosos de depuração de scripts do lado do cliente. Finalmente identifiquei o erro em uma linha de código gerada pelo Anthem:
control.innerHTML = resultado.controls[controlID];
Após verificar as informações relevantes, descobri que no IE, ao atribuir um valor ao atributo innerHTML, o valor atribuído será verificado. Se não estiver bem formado, poderá ocorrer um "erro de tempo de execução desconhecido".
Então julguei que havia algo errado com a saída HTML do anhem.Repeater. Como você pode ver nas duas linhas destacadas no código acima, o rótulo da tabela está fora do Repetidor. Portanto, o próprio Repetidor produz uma série de tr, e não um todo bem formado.
Então coloquei o início e o final das tags da tabela no HeaderTemplate e FooterTemplate do Repetidor, respectivamente, e o problema foi resolvido.
(A razão pela qual coloquei a tag da tabela fora antes foi porque quando a coloquei no HeaderTemplate e no FooterTemplate, não sei por que o designer do VS não conseguiu mudar para a visualização de design. Alterá-la assim pode resolver o problema. )
Depois que a modificação for bem-sucedida, o código será o seguinte:
<asp:XmlDataSource ID="XmlDataSource2" runat="servidor" XPath="//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<anthem:Repeater ID="rptNeedDocs" runat="server" DataSourceID="XmlDataSource2" AutoUpdateAfterCallBack="False">
<HeaderTemplate>
<table class="minhatabela" width="100%" cellpacing="0" cellpadding="0">
<tr class="formTitle">
<td>
Selecione</td>
<td>
Nomes de arquivos e desenhos</td>
<td>
Deve ser enviado</td>
<td>
É original?</td>
<td>
Observações</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:CheckBox ID="chkDoc" runat="servidor" Checked="True" />
<asp:HiddenField ID="hidDocId" runat="servidor" Value='<%# XPath("@Id") %>' />
</td>
<td>
<asp:Label ID="lblDocName" runat="servidor" Text='<%# XPath("@Nome") %>' />
</td>
<td>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# XPath("@Quantity") %>' Width="30" />
</td>
<td>
<asp:RadioButtonList ID="radiolist_IsOriginal" runat="server" SelectedValue='<%# XPath("@IsOriginal") %>'
RepeatDirection="Horizontal">
<asp:ListItem Value="True">Original</asp:ListItem>
<asp:ListItem Value="False">Copiar</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<Modelo de rodapé>
</tabela>
</FooterTemplate>
</hino:Repetidor>
Após essa depuração, sinto que além dos benefícios da resposta rápida na interface, o Ajax também aumenta a dificuldade de depuração devido à introdução de uma grande quantidade de js, portanto, ao aplicá-lo, você ainda terá que fazer escolhas com base em a situação. Você não pode usar Ajax para tudo