在过去的几天里,我一直在用头撞墙,试图让这个场景发挥作用。
我<asp:UpdatePanel>
在一个页面上有一个外部触发器并包含一个 Telerik RadListView
:
<asp:UpdatePanel runat="server" ID="RationUpdatePanel" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<telerik:RadListView ID="RationListView runat="server"
DataSourceId="RationDataSource"
OnItemCanceling="ItemCancelingHandler"
OnItemEditing="ItemEditingHandler"
OnItemUpdating="ItemUpdateHandler">
<LayoutTemplate>
<table>
<thead>
<tr>...</tr>
</thead>
<tbody>
<tr id="itemPlaceHolder" runat="server"/>
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" ToolTip="Edit" />
<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" ToolTip="Delete" />
</td>
<td>...</td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<tr>
<td>
<asp:LinkButton ID="SaveButton" runat="server" CausesValidation="False" CommandName="Save" Text="Save" ToolTip="Save" />
<asp:LinkButton ID="CancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" ToolTip="Update" />
</td>
<td>...</td>
</tr>
</EditItemTemplate>
</telerik:RadListView>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="UseRationButton" EventName="Click" />
</Triggers>
</UpdatePanel>
后面的代码如下所示:
protected void RationListView_ItemEditing(object sender, RadListViewCommandEventArgs e)
{
((RadListViewDataItem)e.ListViewItem).Edit = true;
}
protected void RationListView_ItemCanceling(object sender, RadListViewCommandEventArgs e)
{
RationListView.ClearEditItems();
((RadListViewDataItem)e.ListViewItem).Edit = false;
}
单击EditButton
或CancelButton
产生预期事件并调用 ObjectDataSource 例程以重新绑定列表,但更新面板未刷新。从事件处理程序调用RationUpdatePanel.Update()
不会改变这种情况。该代码在更新面板之外正常工作:模式更改并显示来自其他模板的按钮。
在任一情况下,单击外部触发器都会显示列表。
更新:我为 beginRequest 和 endRequest 在浏览器中的 PageManager 类中添加了几个 javascript 回调。这些只是在事件发生时显示警报。
该页面包含几个元素,基本上看起来像这样(细节省略):
<div>
<div>
<asp:DropDownList ID="RationDdl"/>
<asp:Button ID="UseRationButton"/>
</div>
<div>
<asp:DropDownList ID="AnimalGroupDdl"/>
<asp:UpdatePanel ID="AnimalWeightUpdatePanel"/>
<ContentTemplate>
<asp:DropDownList ID="AnimalWeightDdl"/>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
<div>
<telerik:RadListBox>
</telerik:RadListBox>
</div>
<div>
<asp:UpdatePanel ID="FeedPreviewUpdatePanel">
<ContentTemplate>
<asp:Repeater>
</asp:Repeater>
</ContentPanel>
</asp:UpdatePanel>
</div>
<div>
<!-- this contains the update panel shown above -->
</div>
第UseFeedRationButton
一个 div 中的 是RationUpdatePanel
. AnimalGroupDdl
是 的外部触发器AnimalWeightUpdatePanel
。SelectedIndexChanged 事件的处理程序会AnimalGroupDdl
填充AnimalWeightDdl
所选组的可用权重等级。它与RationUpdatePanel
or没有交互作用FeedPreviewUpdatePanel
。
这是 的标记UseRationButton
:
<asp:Button ID="UseRationButton" runat="server"
Text="Use This Ration"
OnClick="UseRationButton_Click"
CausesValidation="true"
ValidationGroup="UseRation"
UseSubmitBehavior="false">
</asp:Button>
这是背后的代码:
protected void UseRationButton_Click(object sender, EventArgs e)
{
string text = this.RationDdl.SelectedItem.Text;
this.RationNameLabel.Text = text;
this.RationDataSource.SelectParameters["RationId"].DefaultValue = this.RationDdl.SelectedValue;
}
我一直在测试两种情况:
1) 选择一个口粮RationDdl
并点击UseRationButton
2) 选择一个动物组,然后执行场景 1。
在场景 1 中,异步回发由客户端 asp.net 代码启动,并且按钮事件由服务器端处理。RationListView 已填充,但客户端 endRequest 代码从未执行(不显示警报)。随后单击 RadListView 中的控件会触发异步回发,但列表的状态不会更改,客户端的 endRequest 代码也不会执行。
在场景 2 中,启动异步回发,事件在服务器端处理并AnimalWeightDdl
填充。在这种情况下执行客户端 endRequest 代码(显示警报)。在此选择配给并单击使用配给按钮启动回发之后,填充列表视图并执行 endRequest 代码。在他单击列表视图中的按钮时,会启动异步回发,更改列表的状态并执行 endRequest 代码。
我的工作理论是,某些东西导致客户端上的页面请求管理器类的状态变得模糊,但我无法弄清楚是什么原因造成的。