2010-05-27 10 views
6

Il codice JavaScript generato dal controllo SciptManager di asp.net sembra avere un bug e non può gestire UpdatePanel nascosti. Viene generato un errore JavaScript quando un controllo all'interno di un pannello aggiornato tenta di rendere visibile un altro pannello di aggiornamento.Pannello di aggiornamento ASP.NET all'interno del pannello nascosto bug possibile

Si tratta di un bug con ASP.Net AJAX? E qualcuno ha qualche idea su come aggirare questo?

Ecco un esempio di quello che sto cercando di fare

<script type="text/C#" runat="server"> 
    protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     Panel1.Visible = true; 
    } 
</script> 

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="Show Panel"></asp:LinkButton> 
    </ContentTemplate> 
</asp:UpdatePanel> 

<asp:Panel ID="Panel1" runat="server" Visible="false"> 
    <asp:UpdatePanel ID="UpdatePanel2" runat="server"> 
     <ContentTemplate> 
      blah bla blah 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</asp:Panel> 

Questo è l'errore JavaScript che viene generata quando cliccando sul link "LinkButton1". Questo errore deriva dal JavaScript che viene generato dal asp.net controllo ScriptManager

Error: Sys.InvalidOperationException: Could not find UpdatePanel with ID 'ctl00_ContentPlaceHolder1_UpdatePanel2' 

risposta

3

Si stanno verificando dei problemi perché i contenuti di Panel1 non vengono visualizzati quando la pagina viene prima sottoposta a rendering. Questo ha l'effetto che UpdatePanel2 non è inizializzato correttamente.

(Il gestore di richieste di pagina, che gestisce tutti gli aggiornamenti parziali, deve essere a conoscenza dell'esistenza di UpdatePanel2 e ciò non accadrà se non viene eseguito il rendering. Inoltre, se ci pensate, il pannello di aggiornamento deve render alcuni elementi se non altro per aggiungere un segnaposto div in cui iniettare il suo contenuto su postback parziali).

Non so esattamente cosa si sta cercando di ottenere ma, se si desidera semplicemente che UpdatePanel2 venga attivato da un controllo che non è esso stesso all'interno del pannello di aggiornamento, quindi impostare LinkButton1 come trigger come tale.

<script runat="server"> 
    protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     blabla.Visible = true; 
    } 
</script> 

<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug"> 
</asp:ScriptManager> 

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="Show Panel"></asp:LinkButton> 

<asp:UpdatePanel ID="UpdatePanel2" runat="server" > 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="LinkButton1" /> 
    </Triggers> 
    <ContentTemplate> 
     <asp:PlaceHolder runat="server" ID="blabla" Visible="false"> 
     blah bla blah 
     </asp:PlaceHolder> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Se LinkButton1 deve infatti essere all'interno di un pannello di aggiornamento (forse LinkButton1 non è sempre visibile?) Allora si può fare qualcosa di simile alle seguenti

<script runat="server"> 
    protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     blabla.Visible = true; 
     UpdatePanel2.Update(); 
    } 
</script> 

<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug"> 
</asp:ScriptManager> 

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" > 
    <ContentTemplate> 
     <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Text="Show Panel"></asp:LinkButton> 
    </ContentTemplate> 
</asp:UpdatePanel> 

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional" > 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="LinkButton1" /> 
    </Triggers> 
    <ContentTemplate> 
     <asp:PlaceHolder runat="server" ID="blabla" Visible="false"> 
     blah bla blah 
     </asp:PlaceHolder> 
    </ContentTemplate> 
</asp:UpdatePanel> 
+0

grazie per la risposta esauriente. penseresti che il gestore delle richieste di pagine sarebbe abbastanza intelligente da realizzare il secondo updatepanel non sottoposto a rendering sulla pagina. il tuo secondo suggerimento è vicino a quello che sto cercando di fare. ma farlo in questo modo significherebbe che il pannello di aggiornamento dovrebbe circondare tutti i contenuti del segnaposto, quando, nel mio caso, solo una piccola parte di quei contenuti deve usare ajax. – MakkyNZ

+0

Perché non racchiudere semplicemente il pannello di aggiornamento e posizionare il titolare solo sul contenuto che deve essere aggiornato, quindi? –

2

L'errore che si ottiene non è dalla JavaScript, ma da ASP.NET.

Si ottiene perché si tenta di rendere visibile il Panel1, che è al di fuori del UpdatePanel che si chiama, e questo non è possibile.

Tutto ciò che si intende aggiornare sulla pagina Web deve trovarsi all'interno dello UpdatePanel che si chiama.

Problemi correlati