0

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

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

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

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

谢谢你的时间。

4

3 回答 3

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

于 2012-05-24T19:36:00.473 回答
0

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

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

于 2012-05-24T20:04:51.433 回答
0

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

公共类 MyClass { MyUserControl _controlVariable ;

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

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

     }
  }
}
于 2012-05-24T20:32:45.350 回答