C# 当在可见的占位符内时,Web窗体阻止控件中的页面加载事件为false

C# 当在可见的占位符内时,Web窗体阻止控件中的页面加载事件为false,c#,asp.net,webforms,C#,Asp.net,Webforms,我需要防止UserControl Page_Load事件,以防控件放置在可见属性设置为false的占位符中。 我有一些基类,我的所有用户控件都是从中派生的,这个类是从UserControl类派生的。 我发现: 答案是在页面加载事件处理程序中使用“this.Visible” 或者重写OnPreRender方法并使用它代替页面加载 我需要一些方法在我的BaseControl内解决这个问题, 以避免多次代码更改。 可能吗 提前谢谢 您无法避免执行页面加载。无论如何都会引发此事件,因为它是页面生命周期的

我需要防止UserControl Page_Load事件,以防控件放置在可见属性设置为false的占位符中。 我有一些基类,我的所有用户控件都是从中派生的,这个类是从UserControl类派生的。 我发现: 答案是在页面加载事件处理程序中使用“this.Visible” 或者重写OnPreRender方法并使用它代替页面加载

我需要一些方法在我的BaseControl内解决这个问题, 以避免多次代码更改。 可能吗


提前谢谢

您无法避免执行页面加载。无论如何都会引发此事件,因为它是页面生命周期的一部分。然而,您可以做的是有条件地执行任何基于this.Visible的重逻辑

如果要检查基类中子控件的可见性,然后有条件地处理附加的共享逻辑(无论是什么),可以执行以下操作:

// DerivedChildControlA.ascx
<uc1:ChildControl runat="server" ID="someChildControlID" />




public abstract class BaseControl : UserControl
{
    protected abstract ChildControl DerivedChild { get; }
}

public class DerivedChildControlA : BaseControl
{
    protected override ChildControl DerivedChild
    {
        get { return this.someChildControlID; }
    }
}
//DerivedChildControlA.ascx
公共抽象类BaseControl:UserControl
{
受保护的抽象ChildControl DerivedChild{get;}
}
公共类派生的ChildControlA:BaseControl
{
受保护的重写ChildControl DerivedChild
{
获取{返回this.someChildControlID;}
}
}
一旦获得对该子类的引用,就可以检查其可见性并在基类中执行所需的操作

例如,我通常对所有UserControls执行的操作是将主加载逻辑放在名为Load()的单独方法中。然后我从父级调用这个方法。问题是,您可以有条件地调用Load(),这会给您更多的控制。在您的实例中,可以根据子控件的可见性从父基类调用Load()

编辑:


可能有一种方法可以从页面的子控件集合中删除子控件,但这感觉像是一种黑客行为。如需更多信息,请查看Atera在

上的评论。您可以动态加载用户控件。这样,即使它们不可见,也不会有被加载的问题。因此,在aspx页面上,您可以执行以下操作:

if (showControl == true)
{
    //create an instance of the user control
    WebUserControl1 control1 = (WebUserControl1)LoadControl("~/WebUserControl1.ascx");

    //add it to the page when needed
    PlaceHolder1.Controls.Add(control1);
}
唯一的缺点是控件在每次回发后都会消失,因此您必须跟踪控件是否显示在某处,并在需要时重新创建它

您可以做的另一件事是将用户控件的页面加载保持为空,并创建一个从父页面调用的方法

用户控制

protected void Page_Load(object sender, EventArgs e)
{
    //empty
}

public void doStuffInUserControl()
{
    Label1.Text = "Called from parent!";
}
父aspx页

protected void Page_Load(object sender, EventArgs e)
{
    someChildControlID.doStuffInUserControl();
}

最后我找到了一个解决方案:

public abstract class BaseClass : UserControl
{
    protected override void OnLoad(EventArgs e)
    {
        if (this.Visible)
        {
            base.OnLoad(e);
        }
    }
}

public partial class WebUserControl1 : BaseClass
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // running only if this.Visible = true
    }
}

我可以订阅基类中的Load事件,这会在UserControl的Page_加载之前触发,我可以检查那里的可见性,但我不知道在这一点上要做什么,我尝试调用Dispose方法,正如一些人在类似情况下建议的那样,但它对我不起作用,并且Page_加载仍在触发