我正在使用这个过于简化的代码块:
<% if (MyCondition())
{ %>
<myUsedControl/>
<% }
else
{ %>
<myUnusedControl/>
<% } %>
在我的ascx文件中。我假设当ASP.Net读取此页面时,如果MyCondition()返回true,它将完全忽略else子句中的任何内容。情况并非如此,即使在浏览器显示页面时正确隐藏了myUnusedControl,myUnusedControl的PageLoad和OnPreRendered事件仍会在加载页面时被触发。
这是为什么?如何在呈现页面时确保完全忽略一大块ascx或aspx?
感谢您的时间。
答案 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");
}
}
}