Введение: Anthem — это полезная платформа Ajax, поддерживающая ASP.NET 1.1, 2.0.
Поскольку все элементы управления в этой платформе наследуются от собственных серверных элементов управления ASP.NET, почти все свойства и поведение этих элементов управления сохраняются (за исключением изменения их PostBack на необновляемый вызов CallBack). Таким образом, кривая обучения очень мягкая.
Сегодня я столкнулся с неприятной проблемой отладки при использовании Anthem, которая описана здесь.
В приведенном ниже коде я использую элемент управления Anthem.Repeater.
<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">
<Шаблон заголовка>
<tr class="formTitle">
<тд>
Выбрать</td>
<тд>
Имена файлов и чертежей</td>
<тд>
Должно быть отправлено</td>
<тд>
Это оригинально?</td>
<тд>
Примечания</td>
</tr>
</HeaderTemplate>
<Шаблон элемента>
<тр>
<тд>
<asp:CheckBox ID="chkDoc" runat="server" Checked="True" />
<asp:HiddenField ID="hidDocId" runat="server" Value='<%# XPath("@Id") %>' />
</td>
<тд>
<asp:Label ID="lblDocName" runat="server" Text='<%# XPath("@Name") %>' />
</td>
<тд>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# XPath("@Quantity") %>' Width="30" />
</td>
<тд>
<asp:RadioButtonList ID="radiolist_IsOriginal" runat="server" SelectedValue='<%# XPath("@IsOriginal") %>'
RepeatDirection="Горизонтально">
<asp:ListItem Value="True">Исходный</asp:ListItem>
<asp:ListItem Value="False">Копировать</asp:ListItem>
</asp:RadioButtonList>
</td>
<тд>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</anthem:Repeater>
</таблица>
При запуске этого кода иногда возникает ошибка JS: «Неизвестная ошибка времени выполнения».
И эта ошибка возникает только в определенных ситуациях и является нормальной в других подобных ситуациях.
К счастью, VS 2005 предоставляет очень мощные возможности отладки сценариев на стороне клиента. Наконец я определил ошибку в строке кода, сгенерированной Anthem:
control.innerHTML = result.controls[controlID];
Проверив соответствующую информацию, я обнаружил, что в IE при присвоении значения атрибуту InnerHTML будет проверяться присвоенное значение. Если он сформирован неправильно, может возникнуть «неизвестная ошибка времени выполнения».
Поэтому я решил, что с HTML-выводом anthem.Repeater что-то не так. Как видно из двух выделенных строк в приведенном выше коде, метка таблицы находится за пределами повторителя. Поэтому сам Репитер выдает серию tr, не совсем корректно сформированную.
Поэтому я поместил начало и конец тегов таблицы в HeaderTemplate и FooterTemplate повторителя соответственно, и проблема была решена.
(Причина, по которой я раньше помещал тег таблицы снаружи, заключалась в том, что, когда я помещал его в HeaderTemplate и FooterTemplate, я не знаю, почему дизайнер VS не мог переключиться на представление дизайна. Изменение его таким образом может решить проблему. )
После успешной модификации код выглядит следующим образом:
<asp:XmlDataSource ID="XmlDataSource2" runat="server" XPath="//NeedDocs/Doc"
EnableCaching="false"></asp:XmlDataSource>
<anthem:Repeater ID="rptNeedDocs" runat="server" DataSourceID="XmlDataSource2" AutoUpdateAfterCallBack="False">
<Шаблон заголовка>
<table class="mytable" width="100%" cellpacing="0" cellpadding="0">
<tr class="formTitle">
<тд>
Выбрать</td>
<тд>
Имена файлов и чертежей</td>
<тд>
Должно быть отправлено</td>
<тд>
Это оригинально?</td>
<тд>
Примечания</td>
</tr>
</HeaderTemplate>
<Шаблон элемента>
<тр>
<тд>
<asp:CheckBox ID="chkDoc" runat="server" Checked="True" />
<asp:HiddenField ID="hidDocId" runat="server" Value='<%# XPath("@Id") %>' />
</td>
<тд>
<asp:Label ID="lblDocName" runat="server" Text='<%# XPath("@Name") %>' />
</td>
<тд>
<asp:TextBox ID="txtQuantity" runat="server" Text='<%# XPath("@Quantity") %>' Width="30" />
</td>
<тд>
<asp:RadioButtonList ID="radiolist_IsOriginal" runat="server" SelectedValue='<%# XPath("@IsOriginal") %>'
RepeatDirection="Горизонтально">
<asp:ListItem Value="True">Исходный</asp:ListItem>
<asp:ListItem Value="False">Копировать</asp:ListItem>
</asp:RadioButtonList>
</td>
<тд>
<asp:TextBox ID="txtComment" runat="server" Text='<%# XPath("Comment") %>' />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</таблица>
</FooterTemplate>
</anthem:Repeater>
После этой отладки я чувствую, что помимо преимуществ быстрого реагирования на интерфейс, Ajax также увеличивает сложность отладки из-за введения большого количества js, поэтому при его применении все равно придется делать выбор, исходя из ситуация. Вы не можете использовать Ajax для всего
http://www.cnblogs.com/RChen/archive/2006/08/06/anthem_debug.html
.