2010-05-27 21 views
6

Die JavaScript generiert von der asp.net SciptManager-Steuerelement scheint einen Fehler zu haben und kann versteckte UpdatePanels behandeln. Ein JavaScript-Fehler wird ausgelöst, wenn ein Steuerelement in einem aktualisierten Bereich versucht, einen anderen Aktualisierungsbereich sichtbar zu machen.ASP.NET updatepanel in versteckten Bereich möglichen Fehler

Ist das ein Fehler mit ASP.Net AJAX? Und hat jemand irgendwelche Ideen, wie man das umgehen kann? Hier

ist ein Beispiel dafür, was ich versuche,

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

Dies ist die JavaScript-Fehler zu tun, die ausgelöst werden, wenn auf dem „LinkButton1“ Link klicken. Dieser Fehler kommt aus dem JavaScript, das durch das asp.net Scriptmanager-Steuerelement

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

Antwort

3

Es treten Probleme auf, da der Inhalt von Panel1 nicht wiedergegeben wird, wenn die Seite zum ersten Mal gerendert wird. Dies hat zur Folge, dass UpdatePanel2 nicht richtig initialisiert wird.

(Der Seitenanforderungs-Manager, der alle Teilupdates verwaltet, muss auf die Existenz von UpdatePanel2 achten, und dies passiert nicht, wenn es nicht gerendert wird. Wenn Sie darüber nachdenken, muss das Update-Panel render einige Elemente, wenn nur ein Platzhalter Div hinzufügen, in dem es seinen Inhalt auf partielle Postbacks injizieren wird).

Ich weiß nicht genau, was Sie erreichen möchten, aber, wenn Sie einfach Ihr UpdatePanel2 von einem Steuerelement ausgelöst werden soll, das nicht selbst im Update-Bereich ist, dann setzen Sie LinkButton1 als Auslöser so.

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

Wenn LinkButton1 in der Tat innerhalb eines Update-Panel sein (vielleicht LinkButton1 ist nicht immer sichtbar?), Dann können Sie so etwas wie der folgenden

<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

Dank für die gründliche Antwort tun. Sie würden denken, dass der Seitenanforderungsmanager intelligent genug ist, um zu erkennen, dass das zweite Updatepanel nicht auf der Seite gerendert wird. Ihr zweiter Vorschlag ist nahe, was ich versuche zu tun. aber das würde bedeuten, dass das Update-Panel den gesamten Inhalt des Platzhalters umfassen müsste, wenn in meinem Fall nur ein kleiner Teil dieses Inhalts Ajax verwenden muss. – MakkyNZ

+0

Warum nicht einfach das Update-Panel und den Halter um den Inhalt legen, der dann aktualisiert werden muss? –

2

Der Fehler, den Sie nicht aus dem JavaScript erhält erzeugt wird, sondern von ASP.NET.

Sie erhalten es, weil Sie versuchen, die Panel1 sichtbar machen, das ist außerhalb der UpdatePanel, dass Sie es nennen, und das ist nicht möglich.

Alles, was Sie auf der Webseite aktualisieren werden, muss innerhalb der UpdatePanel sein, die Sie anrufen.