0

我有一个 C# .net 4.0 网站项目,上面有一个相当复杂的过滤搜索页面。在中继器中添加了多个更新面板。当一个 UpdatePanel 进行回发时 - 所有其他 UpdatePanel 也会同时回发。

这成为一个问题,因为根据用户选择查看的项目数量可能会有很多很多的 UpdatePanel。我知道 UpdatePanels 并不理想 - 我没有写这个,但必须尝试快速修复它!

LandingPage 包含一个 UpdatePanel,里面有一个 Repeater 控件。在转发器中有一个名为 Article 的用户控件。Article 控件包含一些 HTML 和称为 Save 的第二个用户控件。Save 控件也有一个 UpdatePanel。

我遇到的问题是只有第一个 btnSave 事件被引发。因此,如果我单击“btnSave”,它会起作用,但所有后续按钮单击事件都不会触发。

我还注意到 Save 控件中的所有 UpdatePanel 实例同时回发 - 这是正常的吗?

所以页面的简化视图是这样的:

登陆页面.aspx

<asp:UpdatePanel ID="pnl" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
  <ContentTemplate>
    <asp:Repeater ID="resultsRep" runat="server">
      <ItemTemplate>
        <uc:Article id="Article1" runat="server" />
      </ItemTemplate>
    </asp:Repeater>
    <asp:Button id="btnLoadMore" runat="server" Text="Load More" />
  </ContentTemplate>
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="btnLoadMore" EventName="Click" />
  </Triggers>
<asp:UpdatePanel>

自定义用户控件“文章”

<asp:PlaceHolder ID="ArticlePanel" runat="server">
  <!-- Assorted HTML stuff here -->
  <uc:Save id="Save1" runat="server" />
</asp:PlaceHolder>

自定义用户控件“保存”

<asp:UpdatePanel ID="ctl" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="True">
  <ContentTemplate>
    <asp:LinkButton ID="btnSave" runat="server" OnClick="btnSave_Click" CausesValidation="False" Text="Save" />
  </ContentTemplate>
</asp:UpdatePanel>

一如既往地提前感谢。

编辑

经过进一步调查,使用 Firebug 控制台我发现没有发生后续的回发,因为抛出了以下错误:

505|error|500|Invalid postback or callback argument.  
Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  
For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  
If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.|

所以似乎我以某种方式发回了一些狡猾的东西?

4

1 回答 1

0

问题归结于使用嵌套的 UpdatePanel。我不知道错误本身实际上来自哪里,但经过反复试验,我发现父 UpdatePanel 配置不正确。

父 UpdatePanel 应该是这样的:

<asp:UpdatePanel ID="pnl" runat="server" UpdateMode="Always" ChildrenAsTriggers="true">

区别在于 UpdateMode="Always" 和 ChildrenAsTriggers="true"。UpdateMode 告诉父 UpdatePanel 在任何子重新加载时刷新。ChildrenAsTriggers 属性允许子 UpdatePanel 导致刷新父。

所以现在它可以工作了——主要是。我仍然有每一个 UpdatePanel 每次都发回的问题。它确实效率低下,但我似乎无法阻止它。

于 2013-02-27T16:31:23.777 回答