0

我有一个动态创建多个用户控件的 .aspx 页面,每个用户控件都有自己的代码,这些代码基于用户控件级别的多个事件触发。问题是,在特定用户控件中的事件触发之前,父页面Load方法也会触发。因为每个控件都是动态添加的,所以这不是一个微不足道的处理量,因为必须重新添加每个控件。

我希望能够在不强制更新托管它的页面上的情况下触发 UserControl 事件。我尝试将整个用户控件放在一个 中UpdatePanel,但用户控件中的回发仍然强制为父级加载页面。

这是一些省略了某些部分的测试代码,并且以声明方式而不是以编程方式添加了控件。

.ASPX 父页面

<%@ Page Language="vb" CodeBehind="MyParent.aspx.vb" %>
<%@ Register TagPrefix="uc" TagName="Control" Src="MyControl.ascx" %>

<form id="form1" runat="server">
    <asp:ScriptManager runat="server"></asp:ScriptManager>
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            <uc:Control ID="Control1" runat="server" />
        </ContentTemplate>
    </asp:UpdatePanel>
</form>

.ASCX 用户控制

<%@ Control Language="vb"  CodeBehind="MyControl.ascx.vb"  %>
<p>Control Added</p>
<asp:Button runat="server" Text="ForcePostBack"/>
4

2 回答 2

2

这就是ASP.NET WebForms page life-cycle工作原理。控制回发将导致主机(读取:父)页面通过其Page_Load. 如果你不喜欢这个模型,那么你应该考虑ASP.NET MVC一个client-side解决方案,你可以AJAX调用来获取数据,然后通过模板逻辑进行客户端渲染。

于 2013-07-08T21:10:27.310 回答
1

您可以通过使用像“IsFirstLoad”这样的 Session 变量来避免它,然后仅在 IsFirstLoad 为空(或真)时呈现 UC 吗?

此外,我发现在 Page_Init 中动态呈现的项目将通过 PostBack 持续存在,因此您不必重新呈现。不过,不知道这是否适用于 UC。

于 2013-07-08T21:22:00.083 回答