2010-05-27 19 views
6

El JavaScript generado por el control asp.net SciptManager parece tener un error y no puede manejar los paneles de actualización ocultos. Se produce un error de JavaScript cuando un control dentro de un panel actualizado intenta hacer visible otro panel de actualización.Panel de actualización de ASP.NET dentro del panel oculto error posible

¿Esto es un error con ASP.Net AJAX? ¿Y alguien tiene alguna idea de cómo evitar esto?

Aquí es un ejemplo de lo que estoy tratando de hacer

<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> 

Este es el error de JavaScript que se tira cuando se hace clic en el enlace "LinkButton1". Este error viene del Javascript que se genera por el asp.net control ScriptManager

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

Respuesta

3

Tiene problemas porque el contenido del Panel1 no se muestra cuando la página se procesa por primera vez. Esto tiene el efecto de que UpdatePanel2 no se ha inicializado correctamente.

(El administrador de solicitud de página, que gestiona todas las actualizaciones parciales, debe conocer la existencia de UpdatePanel2 y esto simplemente no sucederá si no se procesa. Además, si lo piensa, el panel de actualización debe renderizar algunos elementos solo para agregar un marcador de posición en el que inyectará su contenido en devoluciones parciales).

No sé exactamente lo que está tratando de lograr pero, si simplemente quiere que su UpdatePanel2 sea activado por un control que no está dentro del panel de actualización, configure LinkButton1 como un desencadenante como ese.

<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> 

Si LinkButton1 hecho debe estar dentro de un panel de actualización (tal vez LinkButton1 no siempre es visible?), Entonces usted puede hacer algo como los siguientes

<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

gracias por la respuesta completa. podría pensar que el administrador de solicitud de página sería lo suficientemente inteligente como para darse cuenta de que el segundo panel de actualización no se representa en la página. su segunda sugerencia está cerca de lo que intento hacer. pero hacerlo de esa manera significaría que el panel de actualización debería rodear todos los contenidos del marcador de posición, cuando, en mi caso, solo una pequeña parte de ese contenido necesita usar ajax. – MakkyNZ

+0

¿Por qué no simplemente envuelve el panel de actualización y coloca el soporte solo alrededor del contenido que necesita actualizarse? –

2

El error que se obtiene no es del JavaScript, pero desde ASP.NET.

Lo obtiene porque intenta hacer visible el Panel1, que está fuera del UpdatePanel que usted llama, y ​​esto no es posible.

Todo lo que va a actualizar en la página web debe estar dentro del UpdatePanel al que llama.

Cuestiones relacionadas