簡體   English   中英

在不應該呈現的控件上調用PageLoad和OnPreRender

[英]PageLoad and OnPreRender invoked on controls that should not be rendered

我正在使用這個過於簡化的代碼塊:

<% if (MyCondition())
{ %>
<myUsedControl/>
<% }
else
{ %>
<myUnusedControl/>
<% } %>

在我的ascx文件中。 我假設當ASP.Net讀取此頁面時,如果MyCondition()返回true,它將完全忽略else子句中的內容。 情況並非如此,即使在瀏覽器顯示頁面時myUnusedControl已正確隱藏,myUnusedControl的PageLoad和OnPreRendered事件仍會在我加載頁面時觸發。

為什么是這樣? 如何確保呈現頁面時完全忽略一部分ascx或aspx?

謝謝你的時間。

ASP.NET無法推斷MyCondition()不依賴於已訂閱的PreRender事件的執行。 該方法還可能具有不應執行兩次的副作用,因此應只調用一次,並應盡可能晚地調用。 還需要在事件周期中使所有控件保持最新狀態。 當一個頁面尚未初始化而其他頁面已經觸發了回發事件時,頁面中的不同組件應該如何工作?

在一個有些人為的示例中:

Boolean _condition;
Boolean MyCondition() {
    return _condition;
}

void MyContrivedPreRender(Object sender, EventArgs e) {
    _condition = true;
}

<% if(MyCondition()) { %>
    <asp:Literal runat="server" Text="Hello world?"
                 OnPreRender="MyContrivedPreRender" />
<% } %>

您總是可以使用第二個控件創建一個重復頁面,並將if條件分支放在管道的前面,以控制要加載的頁面。

對於此示例,您始終可以將控件手動添加到后面的代碼中的控件集合中,然后進行分支操作,而不是在ascx / aspx頁面標記中注冊控件。

根據頁面OnInit中的條件(LoadControl)動態加載控件,並在所需的方法中使用該控件變量。

公共類MyClass {MyUserControl _controlVariable;

protected override void OnInit(EventArgs e)
{
     if (MyCondition())  
     { 
          _controlVariable  = Loadcontrol("control1.ascx");
     }

     else  
     { 
         _controlVariable  = Loadcontrol("control2.ascx");

     }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM