Web 窗体可防止Page_Load事件在占位符内可见 false 时处于控制状态



我需要防止用户控件Page_Load事件,以防放置在占位符中的控件将 Visible 属性设置为 false。 我有一些基类,我的所有用户控件都派生自该基类,而此类派生自UserControl类。 我发现这个:如何在可见的假页面上停止执行UC 答案是使用"这个。可见"在Page_Load事件处理程序内 或者重写 OnPreRender 方法并使用它而不是 Page_Load。

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

提前感谢!

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

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

您无法执行任何操作来规避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; }
    }
}

获取对该子项的引用后,可以检查其可见性并在基类中执行所需的操作。

例如,我通常对所有用户控件所做的是将主要加载逻辑放在一个名为 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();
}

相关内容

最新更新