2010-05-27 35 views
6

JavaScript được tạo ra bởi điều khiển asp.net SciptManager dường như có lỗi và không thể xử lý UpdatePanels ẩn. Một lỗi JavaScript được ném khi một điều khiển trong một bảng điều khiển được cập nhật cố gắng hiển thị một bảng cập nhật khác.ASP.NET updatepanel bên trong bảng điều khiển ẩn có thể lỗi

Đây có phải là lỗi với ASP.Net AJAX không? Và có ai có bất kỳ ý tưởng làm thế nào để có được xung quanh này?

Dưới đây là một ví dụ về những gì tôi đang cố gắng để làm

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

Đây là lỗi JavaScript mà bị ném khi nhấp vào "LinkButton1" liên kết. Lỗi này xuất phát từ JavaScript được tạo bởi điều khiển asp.net ScriptManager

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

Trả lời

3

Bạn đang gặp sự cố vì nội dung của Panel1 không được hiển thị khi trang được hiển thị lần đầu tiên. Điều này có tác dụng mà UpdatePanel2 không được khởi tạo đúng cách.

(Trình quản lý yêu cầu trang, quản lý tất cả các bản cập nhật một phần, cần lưu ý đến sự tồn tại của UpdatePanel2 và điều này sẽ không xảy ra nếu nó không được hiển thị. Ngoài ra, nếu bạn nghĩ về nó, bảng cập nhật cần hiển thị một số yếu tố nếu chỉ để thêm một trình giữ chỗ div vào đó nó sẽ tiêm nội dung của nó trên một phần postbacks).

Tôi không biết chính xác những gì bạn đang cố gắng đạt được, nhưng nếu bạn chỉ muốn UpdatePanel2 của bạn được kích hoạt bởi một điều khiển không nằm trong bảng cập nhật, hãy đặt LinkButton1 làm trình kích hoạt như vậy.

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

Nếu LinkButton1 phải thực sự được bên trong một bảng cập nhật (có lẽ LinkButton1 không phải lúc nào cũng có thể nhìn thấy?) Sau đó bạn có thể làm một cái gì đó như sau

<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

cảm ơn vì câu trả lời thấu đáo. bạn sẽ nghĩ rằng trình quản lý yêu cầu trang sẽ đủ thông minh để nhận ra updatepanel thứ hai không được hiển thị trên trang. đề xuất thứ hai của bạn gần với những gì tôi đang cố gắng thực hiện. nhưng làm theo cách đó có nghĩa là bảng cập nhật sẽ phải bao quanh tất cả nội dung của trình giữ chỗ, khi, trong trường hợp của tôi, chỉ một phần nhỏ nội dung đó cần sử dụng ajax. – MakkyNZ

+0

Tại sao không chỉ quấn bảng cập nhật và người giữ chỗ chỉ xung quanh nội dung cần được cập nhật? –

2

Lỗi bạn nhận được không phải từ JavaScript, mà từ ASP.NET.

Bạn hiểu vì bạn cố gắng hiển thị Panel1, nằm ngoài số UpdatePanel mà bạn gọi, và điều này là không thể.

Mọi thứ bạn sẽ cập nhật trên trang web phải nằm trong số UpdatePanel mà bạn gọi.

Các vấn đề liên quan