隐藏面板内的ASP.NET updatepanel可能存在错误

时间:2010-05-27 02:41:05

标签: javascript asp.net ajax updatepanel

asp.net SciptManager控件生成的JavaScript似乎有一个bug,无法处理隐藏的UpdatePanel。当一个更新的面板中的控件尝试使另一个更新面板可见时,将引发JavaScript错误。

这是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'

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

您得到的错误不是来自JavaScript,而是来自ASP.NET。

你得到它是因为你试图让Panel1显示在你所称的UpdatePanel之外,这是不可能的。

您要在网页上更新的所有内容都必须位于您呼叫的UpdatePanel内。