【问题标题】:Lazy loading tabs with user controls带有用户控件的延迟加载选项卡
【发布时间】:2012-06-07 11:38:25
【问题描述】:

我想在 AJAX 选项卡容器中使用延迟加载选项卡。我已经实施了。但我面临的问题是,当我单击按钮或触发该用户控件中的任何事件时,它不会被触发;没发生什么事。

<asp:TabContainer runat="server" ID="TabContainerUp" 
        ActiveTabIndex="0" AutoPostBack="true" OnActiveTabChanged="TabContainerUp_ActiveTabChanged">
        <asp:TabPanel ID="tab1" runat="server">
            <HeaderTemplate>
                <img src="images/uc1.png" alt="" />
            </HeaderTemplate>
            <ContentTemplate>
                <asp:Panel ID="pnlUC1" runat="server">
                </asp:Panel>
            </ContentTemplate>
        </asp:TabPanel>
        <asp:TabPanel ID="tab2" runat="server">
            <HeaderTemplate>
                <img src="images/uc2.png" alt="" />
            </HeaderTemplate>
            <ContentTemplate>
                <asp:Panel ID="pnlUC2" runat="server">
                </asp:Panel>
            </ContentTemplate>
        </asp:TabPanel>
    </asp:TabContainer>

代码隐藏:

    protected void TabContainerUp_ActiveTabChanged(object sender, EventArgs e)
    {
        string tabName = TabContainerUp.ActiveTab.ID;
        getActiveTab(tabName);
    }

    public void getActiveTab(string tabName)
    {
        UserControl uc;
        //uc.
        switch (tabName)
        {
            case "tab1":
                pnlUC1.Controls.Clear();
                uc = Page.LoadControl("~/Controls/UC1.ascx") as UserControl;
                pnlUC1.Controls.Add(uc);
                break;
            case "tab2":
                pnlUC2.Controls.Clear();
                uc = Page.LoadControl("~/Controls/UC1.ascx") as UserControl;
                pnlUC2.Controls.Add(uc);
                break;
        }
    }

【问题讨论】:

  • 关于如何延迟加载 ajax 标签面板的最佳教程:mattberseth.com/blog/2007/07/…
  • @TimSchmelter 我已经尝试过了。它没有解决我的问题。

标签: c# asp.net ajax lazy-loading tabcontainer


【解决方案1】:

您需要最迟在Page_Load 中的每个回发上重新创建动态创建的控件,并使用与以前相同的 ID。因此,您可以在ActiveTabChanged 中加载并将它们添加到您的面板中,但您需要在Page_Init/Page_Load 的下一次回发中重新创建它们。因此,您需要将要重新创建的内容存储在某个地方(例如在 Session 中)。

但我假设您使事情变得比必要的更复杂,您甚至可以简单地创建这些 UserControls,甚至以声明方式(在 aspx 上),初始 Visible 状态为 false。然后您只需要在ActiveTabChanged 中根据需要切换控件的可见性。

注意:不可见的服务器端 web 控件根本不会呈现给客户端,也不会保存 ViewState。所以声明它们没有缺点。

Lazy-Load 并不意味着您尽可能晚地创建这些控件,而是意味着您尽可能晚地对它们进行数据绑定。因此,永远不要将它们从page_load(例如在 UserControl 中)绑定到数据库,而只能从在必要时从页面调用的方法(这里从 ActiveTabChanged)绑定到数据库。因此,您可以在 UserControl UC1 中实现公共方法 BindData

这是一个简单的例子:

switch (tabName)
{
    case "tab1":
        UC1_1.Visible = true;
        UC1_1.BindData();
        UC1_2.Visible = false;
        break;
    case "tab2":
        UC1_1.Visible = false;
        UC1_2.Visible = true;
        UC1_2.BindData();
        break;
}

在你的UserControl

public void BindData()
{
    // put here all your databinding stuff 
    // that is in page_load now ...
}

这可能是关于延迟加载 ajax TabPanels 的最佳教程:

【讨论】:

  • 如果我确实为 false ,那么标签也会被加载。加载用户控件。我不希望它们在页面加载时加载,因为它会使我的页面加载速度变慢。我这样做是为了提高我的页面加载速度。
  • @coder311: 这就是我的意思:"....永远不要将它们从 page_load 绑定到数据库......" 使它们可见并数据绑定它们来自 ActiveTabChanged 而不是来自 page_load。它们不能自动加载,只能在需要时手动加载。我可以提供public void DataBind 方法的示例吗?
  • 是的。它会让我更好地理解。
  • 嗨..蒂姆..我已经遵循了这种方法..我在从活动用户控件中的控件回发时遇到了一些问题。
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 2018-02-01
  • 2021-04-27
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多