我有一个动态创建多个用户控件的.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"/>
答案 0 :(得分:2)
这就是ASP.NET WebForms page life-cycle
的工作原理。控制回发将导致主机(读取:父)页面通过其Page_Load
。如果您不喜欢这个模型,那么您应该考虑ASP.NET MVC
或client-side
解决方案,您可以在其中进行AJAX
调用以获取数据,然后通过模板逻辑进行客户端渲染。 / p>
答案 1 :(得分:1)
你可以通过像'IsFirstLoad'这样的Session变量来避免它,然后只在IsFirstLoad为null(或者是真)时才渲染UC吗?
另外,我发现在Page_Init中动态呈现的项目将通过PostBack保留,因此您不必重新渲染。但是,不知道这是否适用于UC。