用户控制、委托和 UpdatePanel 问题
User Control, Delegate and UpdatePanel Issue
我目前 运行 遇到 UpdatePanel 问题。我的一个页面有两个用户控件,我称之为 A 和 B。
用户控件 A 有一个包含几个 ASP TextBox 的 UpdatePanel。
<asp:UpdatePanel ID="upA" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true" style="position: relative;">
<ContentTemplate>
<-- content here -->
</ContentTemplate>
</asp:UpdatePanel>
用户控件 B 有一个 UpdatePanel,其中包含一个面板和一个链接到它的 AjaxModalPopup。在面板中,有一个中继器和一个 ASP 按钮。
<asp:UpdatePanel runat="server" ID="upB" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="btnActivePopupContainer" runat="server" Style="display: none;" />
<asp:Panel ID="pnlPopupContainer" runat="server" CssClass="modalPopup modalPopupDraggable" Style="display: none;" Width="750px">
<asp:UpdatePanel ID="upPopup" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel runat="server" ID="pnlHeader" class="header">
<asp:Label ID="Label1" runat="server" Text="<%$ Resources:global, AttentionPopup %>"></asp:Label>
</asp:Panel>
<article>
<asp:Repeater runat="server" ID="rptPopup" OnItemDataBound="rptPopup_ItemDataBound">
<ItemTemplate>
<-- Content -->
</ItemTemplate>
</asp:Repeater>
</article>
<footer>
<div class="or-spacer">
<div class="mask"></div>
</div>
<div class="footer">
<asp:Panel runat="server" ID="pnlBtnBug">
<asp:Button ID="btnOK" runat="server" CssClass="btn yes" Text="<%$ Resources:global, Ok %>" OnClick="btnOK_Click" />
</asp:Panel>
</div>
</footer>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
<ajax:ModalPopupExtender ID="popupContainer" runat="server" BackgroundCssClass="modalBackground" PopupControlID="pnlPopupContainer" TargetControlID="btnActivePopupContainer" Drag="true" PopupDragHandleControlID="pnlHeader"></ajax:ModalPopupExtender>
</ContentTemplate>
当用户点击UserControl B的OK按钮时,会触发一个delegate,调用UserControl A中的一个方法,执行一些字段的更新和UpdatePanel的update方法"upA"。
委托人:
//Delegate Call When the user clicks the ok Button
popup.okHandler = (x) =>
{
A.ChooseOpticienCode(x.Value);
};
在UserControl A后面的代码中:
public void ChooseOpticienCode(string code)
{
<-- some treatments -- >
upOpticien.Update(); <-- crash here
}
当调用方法 upOpticien.Update() 时,出现此错误:
System.InvalidOperationException: The Update method can only be called on UpdatePanel with ID 'upOpticien before Render.
我不明白为什么会出现此错误。我尝试将 UpdatePanel 的 UpdateMode 设置为 "Always",应用程序不再崩溃但字段未更新。
想法?
我终于找到了解决问题的方法。我必须使用 InvokeMember 函数而不是直接调用委托,以便正确执行委托并可以编辑各个字段并更新 UpdatePanel
page.GetType().InvokeMember(OkHandler.Method.Name, System.Reflection.BindingFlags.InvokeMethod, null, page, new[] { this });
(这里,OkHandler 是我的委托)
但是,请注意,使用匿名方法将不起作用,委托必须指向名称为 InvokeMember 的方法。
我目前 运行 遇到 UpdatePanel 问题。我的一个页面有两个用户控件,我称之为 A 和 B。
用户控件 A 有一个包含几个 ASP TextBox 的 UpdatePanel。
<asp:UpdatePanel ID="upA" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true" style="position: relative;">
<ContentTemplate>
<-- content here -->
</ContentTemplate>
</asp:UpdatePanel>
用户控件 B 有一个 UpdatePanel,其中包含一个面板和一个链接到它的 AjaxModalPopup。在面板中,有一个中继器和一个 ASP 按钮。
<asp:UpdatePanel runat="server" ID="upB" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="btnActivePopupContainer" runat="server" Style="display: none;" />
<asp:Panel ID="pnlPopupContainer" runat="server" CssClass="modalPopup modalPopupDraggable" Style="display: none;" Width="750px">
<asp:UpdatePanel ID="upPopup" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel runat="server" ID="pnlHeader" class="header">
<asp:Label ID="Label1" runat="server" Text="<%$ Resources:global, AttentionPopup %>"></asp:Label>
</asp:Panel>
<article>
<asp:Repeater runat="server" ID="rptPopup" OnItemDataBound="rptPopup_ItemDataBound">
<ItemTemplate>
<-- Content -->
</ItemTemplate>
</asp:Repeater>
</article>
<footer>
<div class="or-spacer">
<div class="mask"></div>
</div>
<div class="footer">
<asp:Panel runat="server" ID="pnlBtnBug">
<asp:Button ID="btnOK" runat="server" CssClass="btn yes" Text="<%$ Resources:global, Ok %>" OnClick="btnOK_Click" />
</asp:Panel>
</div>
</footer>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
<ajax:ModalPopupExtender ID="popupContainer" runat="server" BackgroundCssClass="modalBackground" PopupControlID="pnlPopupContainer" TargetControlID="btnActivePopupContainer" Drag="true" PopupDragHandleControlID="pnlHeader"></ajax:ModalPopupExtender>
</ContentTemplate>
当用户点击UserControl B的OK按钮时,会触发一个delegate,调用UserControl A中的一个方法,执行一些字段的更新和UpdatePanel的update方法"upA"。
委托人:
//Delegate Call When the user clicks the ok Button
popup.okHandler = (x) =>
{
A.ChooseOpticienCode(x.Value);
};
在UserControl A后面的代码中:
public void ChooseOpticienCode(string code)
{
<-- some treatments -- >
upOpticien.Update(); <-- crash here
}
当调用方法 upOpticien.Update() 时,出现此错误:
System.InvalidOperationException: The Update method can only be called on UpdatePanel with ID 'upOpticien before Render.
我不明白为什么会出现此错误。我尝试将 UpdatePanel 的 UpdateMode 设置为 "Always",应用程序不再崩溃但字段未更新。
想法?
我终于找到了解决问题的方法。我必须使用 InvokeMember 函数而不是直接调用委托,以便正确执行委托并可以编辑各个字段并更新 UpdatePanel
page.GetType().InvokeMember(OkHandler.Method.Name, System.Reflection.BindingFlags.InvokeMethod, null, page, new[] { this });
(这里,OkHandler 是我的委托)
但是,请注意,使用匿名方法将不起作用,委托必须指向名称为 InvokeMember 的方法。