当窗口内的占位符可见false时,Web窗体会阻止Page_Load事件的控制

时间:2017-06-29 15:01:08

标签: c# asp.net webforms

我需要阻止UserControl Page_Load事件,以防控件放在PlaceHolder中,Visible属性设置为false。 我有一些我的用户控件派生自的基类,这个类派生自UserControl类。 我发现了这个:How to stop the execution of UC at page load on Visible false 答案是在Page_Load事件处理程序中使用“this.Visible” 或者重写OnPreRender方法并使用它而不是Page_Load。

我需要一些方法来解决我的BaseControl中的这个问题, 为了避免多次代码更改。 有可能吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

您无法阻止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 Forums.

上发表的评论

答案 1 :(得分:0)

您可以动态加载用户控件。然后你就不会有加载它们的问题,即使它们不可见。所以在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);
}

唯一的缺点是每次PostBack后控件都会消失,所以你必须跟踪控件是否显示在某处并在需要时重新创建它。

您可以做的另一件事是将用户控件的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();
}

答案 2 :(得分:0)

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

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