![](/img/trans.png)
[英]Visible='<%# UserCanEdit %>' – if set to true inside Page_Load, then control isn't visible
[英]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.