在不应呈现的控件上调用PageLoad和OnPreRender

时间:2012-05-24 19:17:01

标签: asp.net pageload server-tags

我正在使用这个过于简化的代码块:

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

在我的ascx文件中。我假设当ASP.Net读取此页面时,如果MyCondition()返回true,它将完全忽略else子句中的任何内容。情况并非如此,即使在浏览器显示页面时正确隐藏了myUnusedControl,myUnusedControl的PageLoad和OnPreRendered事件仍会在加载页面时被触发。

这是为什么?如何在呈现页面时确保完全忽略一大块ascx或aspx?

感谢您的时间。

3 个答案:

答案 0 :(得分:0)

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" />
<% } %>

答案 1 :(得分:0)

您总是可以使用第二个控件创建一个重复的页面,并将您的if条件分支放在管道中,以控制加载哪个页面。

对于此示例,您始终可以手动将控件添加到后面代码中的控件集合中,并围绕该控件集合进行分支,而不是在ascx / aspx页面标记中注册控件。

答案 2 :(得分:0)

根据您在OnInit中的条件(LoadControl)动态加载控件,并在您需要的方法中使用该控件变量。

公共类MyClass {     MyUserControl _controlVariable;

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

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

     }
  }
}