【问题标题】:Asp.net: conditional loading of user controls failsAsp.net:用户控件的条件加载失败
【发布时间】:2011-08-15 12:52:44
【问题描述】:

你好(抱歉标题不好)

我有一个用户控件,它会根据以下条件加载不同的附加用户控件:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SubPage.ascx.cs" Inherits="SubPage" %>
<%@ Register Src="<srcA>" TagName="A" TagPrefix="CTRL" %>
<%@ Register Src=">srcB>" TagName="B" TagPrefix="CTRL" %>

<% if (someValue == 1) { %>
    Loading user control A..
    <CTRL:A runat="server" />
<% } else { %>
    Loading user control B..
    <CTRL:B runat="server" />
<% } %>

结果看起来是正确的;显示预期的内容。但我注意到,即使显示 someValue != 1 和控件 B,控件 A 仍会在后台加载(调用页面加载)。

这是为什么?什么是更好的方法?谢谢。

【问题讨论】:

    标签: asp.net user-controls


    【解决方案1】:

    Page_Load 被调用是因为你处理了这个事件。 不要尝试以这种方式加载它们,而是从代码隐藏中使用 Visible-Property。

    公开控制器(在您的情况下为 SubPage.ascx)在更改可见状态以加载 UserControl 的内容后调用的公共函数。不可见的控件根本不会呈现为 html。

    如果您真的不需要动态加载控件,可能会导致不必要的 ViewState 或 Event-Handling 问题。 Here 是关于动态用户控件的其他一些缺点。

    【讨论】:

    • 谢谢,我会听从你的建议的。
    • Page_Load 仍然会在两个控件上被调用,对吧?
    • @kappasums:如果您不处理 UserControl 中的 Page_Load-Event,则不会调用它。通常你不需要让你的 UserControl 依赖于任何页面事件,但它应该由页面控制(“公开一个公共函数......”)。
    【解决方案2】:

    您需要改为调用LoadControl 方法

    <% if (someValue == 1) { %>
    Loading user control A..  
    
    Page.LoadControl(("~\ExampleUserControl_A.ascx");
    
    <% } else { %>
        Loading user control B..
        this.LoadControl(("~\ExampleUserControl_B.ascx");
    <% } %>
    

    【讨论】:

    • 感谢您的回答。但由于其他人让我意识到视图状态的复杂性,我将采用他们的方法。
    【解决方案3】:

    代码前端:

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="SubPage.ascx.cs" Inherits="SubPage" %>
    <%@ Register Src="<srcA>" TagName="A" TagPrefix="CTRL" %>
    <%@ Register Src="<srcB>" TagName="B" TagPrefix="CTRL" %>
    <asp:placeholder id="plhControls" runat="server" />
    

    代码背后:

    if (someValue == 1) { 
        CTRLA ctrlA = (CTRLA)LoadControl("~/Controls/ctrlA.ascx");
        plhControls.Controls.Add(ctrlA);
    } else {
        CTRLB ctrlB = (CTRLB)LoadControl("~/Controls/ctrlB.ascx");
        plhControls.Controls.Add(ctrlB);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多