【问题标题】:PageLoad and OnPreRender invoked on controls that should not be rendered在不应呈现的控件上调用 PageLoad 和 OnPreRender
【发布时间】:2012-05-25 04:32:45
【问题描述】:

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

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

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

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

感谢您的宝贵时间。

【问题讨论】:

    标签: asp.net pageload server-tags


    【解决方案1】:

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

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

    【讨论】:

    • 我想避免复制控件,但似乎没有办法解决它。不幸。
    • 在尝试实施这些建议后,我遇到了一个绊脚石:对于建议 1,这意味着我需要为每个包含我的更改的控件和所有页面创建重复的控件包含这些控件,不是一个非常有效的解决方案。对于第二种解决方案,问题是由于这种技术被频繁使用,最终整个页面将在代码隐藏中创建,这不是一个可以接受的长期解决方案。
    【解决方案2】:

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

    【讨论】:

    • 太棒了,这肯定回答了我问题的第一部分:它这样做是因为它不能这样做。谢谢!您对实现我的预期目标有什么建议吗?
    • 为什么需要完全避免一段代码?有没有你想避免的副作用?
    • 是的。对于未执行的分支,永远不要调用任何代码,这一点很重要。它与持续集成有关。布赖恩提供了实现我想要的目标所必需的替代方案。谢谢大家!
    【解决方案3】:

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

    公开课 MyClass { MyUserControl _controlVariable ;

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

    【讨论】:

    • 这也是一个可行的解决方案,类似于Brian的第二个建议。不过,我喜欢设计器机制,并希望尽可能多地保留它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多