从ascx控件触发事件以更新容器中的某些控件

时间:2010-10-06 01:53:15

标签: c# events asp.net-ajax page-lifecycle

我正在从ascx控件中触发一个事件,以便更新ascx控件所属的容器中的某些控件。

通过模态弹出扩展器显示ascx控件。当我单击ascx中的一个按钮时,我会触发一个包含ascx控件的容器所订阅的事件。

事件委托被触发并且预期的逻辑在容器的代码后面运行,问题是尽管已经处理了事件逻辑,但对容器内的控件所做的任何更改都不会更新。当呈现回发结果时,预期的更改不会反映在页面上。

我应该知道有什么陷阱吗?

容器的标记

<asp:Panel ID="panelTreeViewAttributesTitle" runat="server">
<asp:Label ID="someLabel" runat="server" Text="Hello Governor" />
<asp:LinkButton ID="LinkButtonEdit" runat="server" Text="(Edit)" />
<ajax:ModalPopupExtender BackgroundCssClass="modalBackground" Enabled="True" 
     ID="btnEdit_ModalPopupExtender" PopupControlID="modalPanel" runat="server"
     TargetControlID="LinkButtonEdit" />
</asp:Panel>
<asp:Panel ID="modalPanel" runat="server" CssClass="modalPopUp" Style="display: none">
    <xxx:customControl runat="server" ID="myCustomControl" />
</asp:Panel>

容器背后的代码

protected void Page_Load(object sender, EventArgs e)
{
myCustomControl.Updated += eventCaptured;
if (IsPostBack) return;
...
}

void eventCaptured(object sender, EventArgs e)
{
someLabel.Text = "Goodbye Governor";
}

自定义控件

<script type="text/javascript">
function Update() {
    var ajaxManager = $find("<%= RadAjaxManager.GetCurrent(Page).ClientID %>");
    if (ajaxManager != null)
    ajaxManager.ajaxRequest("");
    }
</script>
<asp:Panel ID="panelEditPanel" runat="server">
    <asp:Label ID="lblCMA" runat="server" Text="Call me Arnooold." />
</asp:Panel>
<asp:Button ID="btnUpdate" runat="server" Text="Update" OnClientClick="Update()" />
<asp:Button ID="btnCancel" runat="server" Text="Cancel" />

自定义控件的代码

public event EventHandler Updated;

protected void AjaxManager_AjaxRequest(object sender, AjaxRequestEventArgs e)
{
    //Some DB backend logic
    UpdateFinished();
}

private void UpdateFinished()
{
    if (Updated == null) return;
    Updated(this, null);
}

1 个答案:

答案 0 :(得分:0)

可能按钮点击导致部分回发而不是正常的整页回发。如果是这种情况,整个生命周期将在服务器端运行(包括您的事件处理程序),但当响应返回浏览器时,只有部分HTML将在客户端更新。 “someLabel”可能位于客户端更新的区域之外。