【问题标题】:ASP.NET updatepanel inside hidden panel possible bug隐藏面板内的 ASP.NET updatepanel 可能存在错误
【发布时间】:2011-02-24 11:29:58
【问题描述】:

asp.net SciptManager 控件生成的 JavaScript 似乎有错误,无法处理隐藏的 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'

【问题讨论】:

    标签: javascript asp.net ajax updatepanel


    【解决方案1】:

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

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

    您要在网页上更新的所有内容都必须在您调用的UpdatePanel 内。

    【讨论】:

      【解决方案2】:

      您遇到了问题,因为在首次呈现页面时未呈现 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>
      

      【讨论】:

      • 感谢您的彻底回复。您会认为页面请求管理器足够聪明,可以实现第二个更新面板未呈现在页面上。你的第二个建议接近我想要做的事情。但这样做意味着更新面板必须包围占位符的所有内容,而在我的情况下,只有一小部分内容需要使用 ajax。
      • 为什么不把更新面板和占位符只包裹在需要更新的内容周围呢?
      猜你喜欢
      • 2011-02-10
      • 2013-12-04
      • 2013-01-09
      • 2018-09-12
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      相关资源
      最近更新 更多