每次用户控制事件触发时,父页面加载事件都会触发

时间:2013-07-08 20:43:05

标签: asp.net ajax vb.net

我有一个动态创建多个用户控件的.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"/>

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

你可以通过像'IsFirstLoad'这样的Session变量来避免它,然后只在IsFirstLoad为null(或者是真)时才渲染UC吗?

另外,我发现在Page_Init中动态呈现的项目将通过PostBack保留,因此您不必重新渲染。但是,不知道这是否适用于UC。