0
votes

I have a C# .net 4.0 website project with a fairly complicated filtered search page on it. There are multiple UpdatePanels that are added within a Repeater. When one UpdatePanel does a postback - all the other UpdatePanels also postback at the same time.

This becomes a problem because there can be lots and lots of UpdatePanels dependent on the number of items the user chooses to view. I know UpdatePanels are not ideal - I didn't write this but have to try and fix it quickly!

There is LandingPage that holds an UpdatePanel with a Repeater control inside. Within the repeater is a user control called Article. The Article control contains some HTML and a second user control called Save. The Save control has an UpdatePanel too.

The problem I have is that only the first btnSave event gets raised. So if I click "btnSave" it works but all subsequent button click events do not fire.

I have also noticed that ALL instances of the UpdatePanel in the Save control postback at the same time - is this normal?

So a simplified view of the page is like so:

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

Custom User Control "Article"

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

Custom User Control "Save"

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

Thanks in advance as always.

EDIT

After further investigation, using Firebug console I found that the subsequent postbacks don't occur because the following error is thrown:

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

So it seems somehow I am posting back something dodgy?

1

1 Answers

0
votes

The problem was down to the use of nested UpdatePanels. I don't know where the error itself actually comes from but after trial and error I figured out that the parent UpdatePanel wasn't configured properly.

The parent UpdatePanel should have been like so :

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

The difference being UpdateMode="Always" and ChildrenAsTriggers="true". The UpdateMode tells the parent UpdatePanel to refresh when any of the children reload. The ChildrenAsTriggers attribute allows child UpdatePanels to cause the refresh of the parent.

So now it works - mostly. I still have the issue of every single UpdatePanels posting back everytime. Its really inefficient but I can't seem to stop it.