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

发布于 2024-09-26 10:11:21 字数 2024 浏览 4 评论 0原文

我从 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);
}

I am firing an event from an ascx control in order to update some controls in the container to which the ascx control belongs.

The ascx control is displayed via a modal popup extender. When I click a button inside the ascx, I fire an event to which the container containing the ascx control is subscribes.

The event delegate is fired and the expected logic is run in the container's code behind, the problem is that any changes made to controls inside not the container aren't updated despite the event logic having been processed. The expected changes are not reflected on the page when the results of the postback is rendered.

Are there any pitfalls I should know of?

The markup for the container

<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>

The code behind for the container

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

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

The custom control

<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" />

The custom control's code behind

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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云胡 2024-10-03 10:11:21

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

Maybe the button click is causing a partial post back instead of a normal, full-page post back. If this is the case, the entire life cycle would run on the server side (including your event handler) but only part of the HTML would be updated on the client side when the response comes back to the browser. "someLabel" could be outside the region that gets updated on the client side.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文