繁体   English   中英

Web表单在占位符内显示为false时阻止控件中的Page_Load事件

[英]Web forms prevent Page_Load event in control when inside placeholder that visible false

我需要防止UserControl Page_Load事件,以防将Visible属性设置为false的PlaceHolder中的控件放置。 我有一些基础类,我的所有用户控件都派生自该类,而该类又是从UserControl类派生的。 我发现了这一点: 如何在Visible false上的页面加载时停止执行UC答案是在Page_Load事件处理程序中使用“ this.Visible”,或者重写OnPreRender方法并使用它而不是Page_Load。

我需要某种方法来解决BaseControl内部的此问题,以避免多次代码更改。 可能吗?

提前致谢!

您无法做任何事情来规避Page_Load的执行。 无论此事件是否属于页面生命周期的一部分,都会引发此事件。 但是,您可以做的是根据此条件有条件地执行任何繁琐的逻辑。

如果要从基类检查子控件的可见性,然后有条件地在那里处理其他共享逻辑(无论如何),都可以执行以下操作:

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

一旦获得对那个孩子的引用,就可以检查它的可见性并在基类中执行所需的操作。

例如,通常我对所有UserControl所做的工作都是将主加载逻辑放在称为Load()的单独方法中。 然后我从父级调用此方法。 关键是,您可以有条件地调用Load(),从而为您提供更多控制权。 在您的实例中,您可以根据子控件的可见性从父基类调用Load()。

编辑:

可能有一种方法可以从页面的子控件集合中删除子控件,但这感觉很像黑客。 有关其他信息,请查看Aterra在ASP.NET论坛上的评论

您可以动态加载用户控件。 这样,即使它们不可见,也不会出现被加载的问题。 因此,在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);
}

唯一的缺点是,控件将在每次回发之后消失,因此您必须跟踪控件是否显示在某处,并在需要时重新创建它。

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

用户控制

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM