Einführung: Anthem ist ein nützliches Ajax-Framework, das ASP.NET 1.1 und 2.0 unterstützt.
Da alle Steuerelemente in diesem Framework von den ASP.NET-eigenen Serversteuerelementen erben, bleiben fast alle Eigenschaften und Verhaltensweisen dieser Steuerelemente erhalten (mit Ausnahme der Änderung ihres PostBacks in den Nichtaktualisierungsaufruf von CallBack). Die Lernkurve ist also sehr sanft.
Heute bin ich bei der Verwendung von Anthem auf ein problematisches Debugging-Problem gestoßen, das hier aufgezeichnet wird.
Im folgenden Code verwende ich ein Anthem.Repeater-Steuerelement.
<asp:XmlDataSource ID="XmlDataSource2" runat="server" XPath="//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<table class="mytable" width="100%" cellpacing="0" cellpadding="0">
<anthem:Repeater ID="rptNeedDocs" runat="server" DataSourceID="XmlDataSource2"
AutoUpdateAfterCallBack="False">
<HeaderTemplate>
<tr class="formTitle">
<td>
Wählen Sie</td>
<td>
Datei- und Zeichnungsnamen</td>
<td>
Sollte gesendet werden</td>
<td>
Ist es original?</td>
<td>
Bemerkungen</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:CheckBox ID="chkDoc" runat="server" Checked="True" />
<asp:HiddenField ID="hidDocId" runat="server" Value='<%# XPath("@Id") %>' />
</td>
<td>
<asp:Label ID="lblDocName" runat="server" Text='<%# XPath("@Name") %>' />
</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">Kopieren</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</anthem:Repeater>
</table>
Wenn dieser Code ausgeführt wird, tritt manchmal ein JS-Fehler auf: „Unbekannter Laufzeitfehler“.
Und dieser Fehler tritt nur in bestimmten Situationen auf und ist in anderen ähnlichen Situationen normal.
Glücklicherweise bietet VS 2005 sehr leistungsstarke clientseitige Skript-Debugging-Funktionen. Ich habe den Fehler schließlich auf eine von Anthem generierte Codezeile lokalisiert:
control.innerHTML = result.controls[controlID];
Nachdem ich die relevanten Informationen überprüft hatte, stellte ich fest, dass im IE beim Zuweisen eines Werts zum innerHTML-Attribut der zugewiesene Wert überprüft wird. Wenn es nicht wohlgeformt ist, kann ein „unbekannter Laufzeitfehler“ auftreten.
Daher kam ich zu dem Schluss, dass mit der HTML-Ausgabe von anthem.Repeater etwas nicht stimmte. Wie Sie an den beiden hervorgehobenen Zeilen im Code oben erkennen können, befindet sich die Tabellenbeschriftung außerhalb des Repeaters. Daher gibt der Repeater selbst eine Reihe von tr aus, nicht ein ganzes, wohlgeformtes Ergebnis.
Also habe ich den Kopf und das Ende der Tabellen-Tags in die HeaderTemplate bzw. FooterTemplate des Repeaters eingefügt, und das Problem wurde gelöst.
(Der Grund, warum ich das Tabellen-Tag vorher draußen platziert habe, war, dass ich beim Einfügen in HeaderTemplate und FooterTemplate nicht weiß, warum der VS-Designer nicht zur Entwurfsansicht wechseln konnte. Eine solche Änderung kann das Problem lösen. )
Nach erfolgreicher Änderung lautet der Code wie folgt:
<asp:XmlDataSource ID="XmlDataSource2" runat="server" XPath="//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<anthem:Repeater ID="rptNeedDocs" runat="server" DataSourceID="XmlDataSource2" AutoUpdateAfterCallBack="False">
<HeaderTemplate>
<table class="mytable" width="100%" cellpacing="0" cellpadding="0">
<tr class="formTitle">
<td>
Wählen Sie</td>
<td>
Datei- und Zeichnungsnamen</td>
<td>
Sollte gesendet werden</td>
<td>
Ist es original?</td>
<td>
Bemerkungen</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:CheckBox ID="chkDoc" runat="server" Checked="True" />
<asp:HiddenField ID="hidDocId" runat="server" Value='<%# XPath("@Id") %>' />
</td>
<td>
<asp:Label ID="lblDocName" runat="server" Text='<%# XPath("@Name") %>' />
</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">Kopieren</asp:ListItem>
</asp:RadioButtonList>
</td>
<td>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</anthem:Repeater>
Nach diesem Debugging habe ich das Gefühl, dass Ajax zusätzlich zu den Vorteilen einer schnellen Reaktion auf der Schnittstelle auch die Schwierigkeit des Debuggens aufgrund der Einführung einer großen Menge an js erhöht, sodass Sie bei der Anwendung immer noch Entscheidungen basierend auf treffen müssen die Situation. Sie können Ajax nicht für alles verwenden.
http://www.cnblogs.com/RChen/archive/2006/08/06/anthem_debug.html