簡體   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