![](/img/trans.png)
[英]Should stored procedures be called in OnInit, OnLoad, or 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.