2010-05-27 44 views
6

由asp.net SciptManager控件生成的JavaScript似乎有一個bug,並且不能處理隱藏的UpdatePanels。當一個更新面板中的控件嘗試使另一個更新面板可見時,會引發JavaScript錯誤。隱藏面板內的ASP.NET updatepanel可能的bug

這是ASP.Net AJAX的錯誤嗎?有沒有人有任何想法如何解決這個問題?

這裏是我想要做的

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

這是「LinkBut​​ton1」點擊鏈接時被拋出的JavaScript錯誤的例子。此錯誤來自由asp.net ScriptManager控件生成的JavaScript

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

回答

3

您遇到了問題,因爲Panel1的內容在頁面第一次呈現時不會呈現。這具有UpdatePanel2未正確初始化的效果。這個頁面請求管理器管理所有的部分更新,需要知道UpdatePanel2的存在,如果它沒有被渲染,這就不會發生,而且,如果你仔細想想,更新面板需要渲染一些元素,如果只是添加一個佔位符div,它將在部分回發中注入其內容。

我不知道你想要達到什麼目的,但是,如果你只是想讓你的UpdatePanel2被一個本身不在更新面板內的控件觸發,那麼將LinkBut​​ton1設置爲這樣的觸發器。

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

如果LinkBut​​ton1的確應該是一個更新面板內(也許LinkBut​​ton1並不總是可見的?),那麼你可以做以下

<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

感謝徹底反應等。 你會認爲頁面請求管理器會足夠聰明,以實現第二個更新面板不會呈現在頁面上。 你的第二個建議接近我試圖做的事情。但是這樣做意味着更新面板將不得不圍繞佔位符的所有內容,在我的情況下,只有一小部分內容需要使用ajax。 – MakkyNZ 2010-05-30 05:45:52

+0

爲什麼不只是將更新面板和佔位符包裝在僅需要更新的內容中呢? – 2010-05-30 20:16:11

2

您得到的錯誤不是來自JavaScript,而是來自ASP.NET。

你得到它是因爲你試圖使Panel1可見,即在你所稱的UpdatePanel之外,這是不可能的。

您打算在網頁上更新的所有內容都必須在您撥打的UpdatePanel之內。