ленивая загрузка asp.net Ajax Control Toolkit гармошка - PullRequest
4 голосов
/ 16 мая 2011

Я использую аккордеон asp.net Ajax Control Toolkit (http://www.asp.net/ajaxlibrary/act_Accordion.ashx), и каждая панель аккордеона содержит довольно много информации.

Вся эта информация генерируется на странице, но не отображается, потому что инструментарий дает неактивным панелям

 (style="display:none;)

Но поскольку информация находится на странице, она становится очень тяжелой для загрузки.

Я ищу способ загрузки панелей по требованию: поэтому, только если пользователь щелкает панель, отправляется запрос ajax и панель загружается и разворачивается.

Можно ли это сделать с помощью этого элемента управления или я должен выбрать другой аккордеон? Любая помощь или предложения приветствуются.

обновление В настоящее время Аккордеон создается с двумя вложенными повторителями. Первый ретранслятор проходит по категориям и создает панель для каждой категории. Второй повторитель повторяется внутри каждой панели, берет содержимое для одной категории и создает содержимое панели.

Pleun

Ответы [ 4 ]

4 голосов
/ 24 мая 2011

У меня нет очков, чтобы комментировать и задавать вам вопросы. Сожалею. (
Мои вопросы касаются того, как вы планируете создать и наполнить Аккордеон.

Будете ли вы создавать панели вручную, используя разметку в IDE, или вы привязываете Accordion к источнику данных, который будет динамически создавать нужные панели?

Будет ли у вас 3 отдельных источника данных или другая комбинация из следующих:
1.) DataSource для инициализации количества панелей и заполнения только информации заголовка панели.
2.) Источник данных для заполнения статического содержимого всех панелей при первой загрузке.
3.) DataSource для заполнения Lazy-Loaded Content одной панели, которую пользователь щелкает, чтобы развернуть.

С вашими ответами я надеюсь обновить этот ответ реальным. Спасибо.

Обновление: это достижимо с помощью Accordion Ajax Control Toolkit.
У меня есть очень базовый код ниже в качестве доказательства концепции. Это может быть более плавным, но я оставляю за вами право добавить изображение «Загрузка» с помощью элемента управления UpdatingProgress, если вы сочтете это необходимым.

Аккордеон в разметке Aspx:
(Обратите внимание на UpdatePanels - вы можете заменить их обратными вызовами, если хотите, я просто хотел, чтобы ответ был простым)

<asp:Accordion ID="acc_Accordion" runat="server" RequireOpenedPane="false" 
        SelectedIndex="-1" onitemcommand="acc_Accordion_ItemCommand" >
    <HeaderTemplate>
        <asp:UpdatePanel ID="up_UpdateHeader" runat="server">
            <ContentTemplate>
            <%--When using "Eval" inside strings for Asp.net controls,
                you MUST wrap them in apostrophes ('),
                otherwise with (") you will get parser errors!--%>
            <asp:LinkButton ID="btn_Header" runat="server"
                 Text='<%# Eval("HeaderText") %>'
                 CommandName="UpdatePane" CommandArgument='<%# Eval("ItemID") %>'
                 Font-Underline="false" ForeColor="Black"
                 style="width:100%; height:100%; cursor:pointer;"/>
                 <%--Use Cursor:Pointer to keep a consistent
                     interface after disabling the button.--%>
            </ContentTemplate>
        </asp:UpdatePanel>
    </HeaderTemplate>
    <ContentTemplate>
        <asp:UpdatePanel ID="up_UpdateContent" runat="server"
                         UpdateMode="Conditional">
            <ContentTemplate>
                <%# Eval("ContentText")%>
                <asp:Label ID="lbl_Content" runat="server"
                     Text="<%# DateTime.Now.ToLongTimeString() %>"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
    </ContentTemplate>
</asp:Accordion>  



Page_Load () - Подготовьте наши «фиктивные» данные:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack == false)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("ItemID");
        dt.Columns.Add("HeaderText");
        dt.Columns.Add("ContentText");

        dt.Rows.Add(new object[] { 123456, "Header 1", "Content A." });
        dt.Rows.Add(new object[] { 654321, "Header 2", "Content B." });

        acc_Accordion.DataSource = new System.Data.DataTableReader(dt);
        acc_Accordion.DataBind();
    }
}



ItemCommand () - захватывает нажатия кнопок внутри Аккордеона:

protected void acc_Accordion_ItemCommand(object sender, CommandEventArgs e)
{
    if (e.CommandName == "UpdatePane")
    {
        AjaxControlToolkit.AccordionContentPanel acp
            = (e as AjaxControlToolkit.AccordionCommandEventArgs).Container;
        UpdatePanel upHeader
            = acc_Accordion.Panes[acp.DisplayIndex].HeaderContainer
             .Controls.OfType<Control>()
             .Single(c => c is UpdatePanel) as UpdatePanel;
        LinkButton btn
            = upHeader.ContentTemplateContainer
             .Controls.OfType<Control>()
             .Single(b => b is LinkButton) as LinkButton;
        UpdatePanel upContent
            = acc_Accordion.Panes[acp.DisplayIndex].ContentContainer
             .Controls.OfType<Control>()
             .Single(c => c is UpdatePanel) as UpdatePanel;
        Label lbl
            = upContent.ContentTemplateContainer
             .Controls.OfType<Control>()
             .Single(c => c is Label) as Label;
        lbl.Text = " ID: " + e.CommandArgument
                 + " and Time: " + DateTime.Now.ToLongTimeString();
        //You can use the ID from e.CommandArgument to query the database
        // for data to update your Repeaters with.
        btn.Enabled = false;//Disabling the button for our Header
        // will prevent Asyncronous Postbacks to update the content again.
        //Only disable this if you don't need to update the content
        // when the user clicks to view the pane again.
        upContent.Update();//Set UpdateMode="Conditional".
    }
}



Я знаю, что это выглядит много, но это всего лишь несколько строк кода (перед упаковкой и комментированием).

2 голосов
/ 25 мая 2011

Совет 4 в 6 Советы по работе с ASP.NET AJAX Accordion Control объясняет, как определить, когда выбранный индекс изменился. Из обработчика событий JavaScript вы можете делать все, что хотите, чтобы обновить содержимое вновь выбранной панели аккордеона (вызвать веб-службу, использовать панель обновления и т. Д.)

В сочетании с другой статьей, объясняющей , как использовать панель обновления для обновления содержимого , когда для простой демонстрации выбрана вкладка:

    <ajaxToolKit:Accordion ID="accSample" runat="server"
 RequireOpenedPane="false" SelectedIndex="-1">
 <Panes>
  <ajaxToolKit:AccordionPane runat="server">
   <Header>Sample</Header>
   <Content>
 <asp:Button ID="btnSample" runat="server" OnClick="OnShowSample" Style="display: none" />
 <script type="text/javascript">
  Sys.Application.add_load(function (sender, args) {
   if (!args.get_isPartialLoad()) { 
    var accSample = $find('<%= accSample.ClientID %>_AccordionExtender');
    accSample.add_selectedIndexChanged(function (sender, eventArgs) {
     $get('<%= btnSample.ClientID %>').click();
    });
   }
  });
 </script>
 <asp:UpdatePanel ID="upSample" runat="server">
  <ContentTemplate>
   <asp:DataGrid ID="dgSample" runat="server" Visible="false"/>
  </ContentTemplate>
  <Triggers>
   <asp:AsyncPostBackTrigger ControlID="btnSample" />
  </Triggers>
 </asp:UpdatePanel>
   </Content>
  </ajaxToolKit:AccordionPane>
 </Panes>
</ajaxToolKit:Accordion>

затем в коде

protected void OnShowSample(object sender, EventArgs e)
{
 dgSample.DataSource = new string[] { "test" };
 dgSample.DataBind();
 dgSample.Visible = true; 
}
1 голос
/ 19 мая 2011

Взгляните на ASPxNavBar элемент управления (часть бесплатного ASPxperience Suite ) от DevExpress . Если для свойства EnableCallBacks ASPxNavBar установлено значение true , содержимое свернутых групп не будет отображаться на стороне клиента. Когда группа раскрывается впервые, ее содержимое извлекается с сервера и затем кэшируется на клиенте. В следующий раз, когда группа будет расширена, ее содержимое будет взято с клиента и обратный вызов на сервер не будет выполнен.

Просмотрите ASPxNavBar - Обратные вызовы (AJAX) Демонстрацию в Интернете для получения дополнительной информации.

0 голосов
/ 20 мая 2011

Все, что я могу вам предложить, это добавить кнопки LinkBile для ваших заголовков и панелей на ваши панели:

        <Panes>
            <asp:AccordionPane ID="First" runat="server">
                <Header>
                    <asp:LinkButton CommandName="ASD2" ID="LinkButton2" runat="server">LinkButton</asp:LinkButton>
                </Header>
                <Content>
                    <asp:Panel ID="Panel2" runat="server" Visible="true">
                         First
                    </asp:Panel>
                </Content>
            </asp:AccordionPane>
            <asp:AccordionPane ID="Second" runat="server">
                <Header>
                    <asp:LinkButton CommandName="ASD" ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
                </Header>
                <Content>
                    <asp:Panel ID="Panel1" runat="server" Visible="false">
                         Second
                    </asp:Panel>
                </Content>
            </asp:AccordionPane>
        </Panes>

и в Accordion1_ItemCommand установите свойство Visible соответствующей панели.

protected void Accordion1_ItemCommand(object sender, CommandEventArgs e)
...