Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698

    AccordionPane e reload asincroni

    Premetto che sono nuovo del framework .NET e dei vari surrogati, mi trovo davanti a questo problema.

    Stiamo usando questo Ajax Control Toolkit che permette di inserire una struttura di tipo Accordion -> AccordionPane, molto bene.
    Accordion ed AccordionPane sono inseriti all'interno di un UpdatePanel.

    Io ho diversi accordion panes che, quando vengono aperti, devono valorizzarsi coi dati letti da qualche parte. L'apertura avviene al click del mouse. Dunque, se imposto

    codice:
    SuppressHeaderPostbacks="true"
    mi aspetto che il pannello si apra e non accada niente lato server, ed in effetti è cosi.

    Se invece lo imposto a false mi aspetterei una richiesta al server ma di tipo asincrono, mentre invece l'intera pagina viene ricaricata. Come mai?

    Seconda domanda. Dove devo scrivere il codice del gestore dell'evento asincrono? Mi pare di aver capito che posso farlo in Page_Load basandomi sul valore di isPostBack, però lo chiedo a voi perchè non mi sembra una soluzione pulitissima.

    Evito di postare il codice perchè credo che il mio errore sia piu concettuale che tecnico, comunque se non è cosi posso postarlo in seguito (è piuttosto lungo e dovrei perdere un po di tempo a dargli una pulita per postare solo quello che effettivamente serve).

    Perdonate se la questione vi sembrerà banale ma ho googlato parecchio oggi senza venirne a capo.

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Ma ho fatto una richiesta cosi strana oppure la domande sono poco chiare?

  3. #3
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Credo che siano poche le persone che hanno utilizzato l'Accordion, tutto qui..

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Uhm ok

    Ma dal punto di vista strettamente concettuale è corretto considerare che un controllo generico, se inserito all'interno di un update panel, gestisce il post back in maniera asincrona?

    Se si, dove va scritto il codice dell'handler asincrono?

  5. #5
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Si, è corretto. L'updatePanel di default, per i controlli all'interno del suo <ContentTemplate>, scatena un PB asincrono. Ad esempio:

    codice:
        <div>
                <asp:ScriptManager runat="server" ID="sm"></asp:ScriptManager>
                
                <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                                   <asp:Button ID="bt1" runat="server" Text="1" />
                                   <asp:Button ID="bt2" runat="server" Text="2" />
                                   <asp:Label ID="lb" runat="server"></asp:Label>
                 </ContentTemplate>
                </asp:UpdatePanel>    
         </div>
    
        Protected Sub bt1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt1.Click
            lb.Text = "ciao dal bottone 1"
        End Sub
    
        Protected Sub bt2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bt2.Click
            lb.Text = "ciao dal bottone 2"
        End Sub
    Gli handler dei due bottoni poi, vanno scritti normalmente, ma i controlli su cui agiscono devono stare all'interno del panel.

    Un esempio per l'accordion comunque lo trovi qui http://www.asp.net/AJAX/AjaxControlT...Accordion.aspx

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Ok intanto grazie della risposta.

    Il link che mi hai passato lo avevo gia visto, ma parla piu che altro di proprietà grafiche e amenità varie, non da grandi informazioni per quanto riguarda il lato server.

    Intanto sono riuscito a capire perchè la pagina viene ricaricata ed era una cosa che c'entra davvero poco con tutto il resto: visual studio, quando si inserisce un AccordionPane, inserisce nel Header del pane stesso un link <a href=''>. Era ovviamente questo link che, cliccato, mi provocava il reload della pagina e questo si risolve semplicemente aggiungendo, ad esempio, un evento onclick="return false". Bene.

    Ora rimane però il problema madre: dove gestire queste cavolo di chiamate asincrone, dal momento che queste non sono generate da un click su un bottone. Devono essere generate dal click sul link,o, piu in generale, dall'apertura del pannello. Credo che, in buona sostanza, io abbia bisogno di forzare un post back ma non so come si fa.

    Perdonatemi, quasi mi vergogno di questa domanda.

    Grazie

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    Bah, credevo di aver fatto qualche progresso ma invece qua non funziona niente.
    Provo a postare un po di codice.

    Quello che ho fatto è stato:
    1. creare, per ogni pane, un bottone nascosto (pane0,pane1,pane2)

    2. associare ad ogni bottone un handler ed un trigger

    3. Forzare via javascript, al click sui link nell'header dei panes, il click sul bottone relativo al pane stesso (sembra un po contorto ma non mi pare ci fosse un altro modo di chiamara via ajax il server all'apertura del pane).

    codice:
    <asp:Content ID="Content1" ContentPlaceHolderID="PageBody" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                        
                <ContentTemplate>
                    <div style="display:none">
                                            
                        <asp:Button OnClick="pane_Click" runat="server" ID="pane0" />
                        <asp:Button OnClick="pane_Click" runat="server" ID="pane1" />
                        <asp:Button OnClick="pane_Click" runat="server" ID="pane2" />
                        
                    </div>
                                
                    <asp:Panel ID="BasePanel" runat="server">
                        <div style="">
                            <ajaxToolkit:Accordion ID="MyAccordion" 
                                                   runat="server"  
                                                   HeaderCssClass="accordionHeader" 
                                                   HeaderSelectedCssClass="accordionHeaderSelected"
                                                   ContentCssClass="accordionContent"
                                                   FadeTransitions="True" 
                                                   FramesPerSecond="40" 
                                                   TransitionDuration="250" 
                                                   AutoSize="None" 
                                                   RequireOpenedPane="true" 
                                                   SuppressHeaderPostbacks="True" 
                                                   Font-Names="Verdana" 
                                                   Font-Size="12px" 
                                                   ForeColor="#666666" 
                                                   Width="90%"
                                                   SelectedIndex="0">
                                <Panes>
                                <ajaxToolkit:AccordionPane ID="AccordionPane0" 
                                                               runat="server"
                                                               Font-Bold="true" 
                                                               Font-Names="Verdana" 
                                                               Font-Size="12px" 
                                                               ForeColor="#666666" 
                                                               TabIndex="0">
                                <Header>
                          <a onclick="document.getElementById('ctl00_PageBody_pane0').click();"> 
                                pane0 
                                </a>
                                            
                                </Header>
                                <Content>...</Content>
                                </ajaxToolkit:AccordionPane>
                                
                                <ajaxToolkit:AccordionPane ID="AccordionPane1" 
                                                               runat="server"
                                                               Font-Bold="true" 
                                                               Font-Names="Verdana" 
                                                               Font-Size="12px" 
                                                               ForeColor="#666666" 
                                                               TabIndex="1">
                                <Header>
                                <a onclick="document.getElementById('ctl00_PageBody_pane0').click();"> pane0 </a>
                                            
                                </Header>
                                <Content>...</Content>
                                </ajaxToolkit:AccordionPane>
               
                                </asp:Panel>
                                </ContentTemplate>
                                <Triggers>
                                    
                                <asp:AsyncPostBackTrigger ControlID="pane0" EventName="Click" />
                                <asp:AsyncPostBackTrigger ControlID="pane1" EventName="Click" />
                                <asp:AsyncPostBackTrigger ControlID="pane2" EventName="Click" />
                                </Triggers>
    Lato server ho scritto questo handler:

    codice:
    protected void pane_Click(object sender, EventArgs e)
            {
                Button b = (Button)sender;
                
                int panel;
                try
                {
                    panel = int.Parse(b.ID.Substring(4, 1));
                }
                catch (System.FormatException)
                {
                    panel = -1;
                }
    
                if (panel < 0) return;
    
               
                
                switch (panel)
                {
                    case 0:
                    case 1:
                    case 2:
    
                    default:
                        break;
    
                }
            }
    Questo viene correttamente invocato, mi sembra di poter dire con una chiamata asincrona,
    ma al termine della chiamata ajax il panel che ho cliccato non si apre. Rimane sempre aperto quello di default.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.