Asp.net 多个UpdatePanel和状态

Asp.net 多个UpdatePanel和状态,asp.net,ajax,asp.net-ajax,updatepanel,user-controls,Asp.net,Ajax,Asp.net Ajax,Updatepanel,User Controls,我有一个用户控件,它有多个更新面板 在页面加载时,我将一个子用户控件动态加载到占位符上(我每次都这样做,不检查回发) 我希望能够维护用户在子用户控件中所做更改的状态。(子用户控件具有html控件以及asp.net控件和其他自定义控件) 每当单击导致回发的按钮a或B时,子用户控件将丢失状态。UpdatePanel的模式已设置为conditional 在OnPageLoad中 我将子控件加载到占位符a 这个子控件有另一个包含大量JS的用户控件。用户可能会在子控件中进行更改 当他们单击作为父控件

我有一个用户控件,它有多个更新面板


在页面加载时,我将一个子用户控件动态加载到占位符上(我每次都这样做,不检查回发)

我希望能够维护用户在子用户控件中所做更改的状态。(子用户控件具有html控件以及asp.net控件和其他自定义控件)

每当单击导致回发的按钮a或B时,子用户控件将丢失状态。UpdatePanel的模式已设置为conditional

在OnPageLoad中

  • 我将子控件加载到占位符a
  • 这个子控件有另一个包含大量JS的用户控件。用户可能会在子控件中进行更改
  • 当他们单击作为父控件一部分的按钮A时,OnPageLoad会导致子控件重新加载,从而丢失用户所做的客户端更改
  • 我想阻止这种情况发生

    以下是ASPX页面的HTML结构

    <UpdatePanel1>
    <UpdatePanelChild1>
        <Button A>
        <Button B>
    </UpdatePanelChild1>
    <UpdatePanelChild2>
        <PlaceHolderA>
    </UpdatePanelChild2>    
    
    
    

    您可以使用ScriptManager,在您的控件中的服务器上运行表单,而不是更新面板

    这样你就不会有邮筒了

    这里有一个很好的参考:

    你好。 乔塞马。

    大宗报价 //Asp.Net代码中的代码

    在我的页面脚本中,我将针对我的Web服务执行Ajax,回调EndHelloWorld可以在不丢失状态的情况下执行任何操作

    希望对你有帮助。。。 亲切的问候。
    Josema.

    看起来您需要删除嵌套的UpdatePanel。在这样的结构中:

    <ParentUpdatePanel>
      <ChildUpdatePanel1 />
      <ChildUpdatePanel2 />
    </ParentUpdatePanel />
    
    
    
    所有更新面板都将始终更新,即使子UpdatePanel设置为conditional,因为父面板实际上是正在更新的面板。因此,其中一个子系统中的回发事件将导致父系统更新

    一般来说,使用那种类型的模式是不好的。。。如果需要一个UpdatePanel中的事件导致另一个UpdatePanel中的更新,则应执行以下操作:

    <asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        <asp:Button ID="buttonA" runat="server" />
        <asp:Button ID="buttonB" runat="server" />
      </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdatePanel ID="up2" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        <asp:Placeholder ID="ph" runat="server" />
      </ContentTemplate>
      <Triggers>
        <asp:AsyncPostBackTrigger ControlID="buttonB" EventName="Click" />
      </Triggers>
    </asp:UpdatePanel>
    

    动态添加控件时,每次加载页面时都需要重新添加控件。我不得不解决类似的困难,我用两种方法来解决。当动态字段被添加到页面上时,我会在用户点击填充或自己添加之前向页面添加一个隐藏控件。通过创建此类占位符,系统可以正确处理viewstate,从而保留用户的更改。我听到您提到的第二个问题是,chich update panel更新可能存在问题。将它们设置为“有条件的”是很好的,但在您的代码背后,如果需要,您还可以在其他RPanel中触发更新。只是updatepanel#.update()


    或者,您也可以将所有更新面板包装到另一个面板中,但我建议不要这样做,因为这会浪费资源。

    看起来您正在丢失动态添加的子控件的ViewState

    这是因为您在页面生命周期中添加它太晚了:ViewState在page.Load事件之前加载

    尝试在Page.Init中添加您的子控件

    <ParentUpdatePanel>
      <ChildUpdatePanel1 />
      <ChildUpdatePanel2 />
    </ParentUpdatePanel />
    
    <asp:UpdatePanel ID="up1" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        <asp:Button ID="buttonA" runat="server" />
        <asp:Button ID="buttonB" runat="server" />
      </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdatePanel ID="up2" runat="server" UpdateMode="Conditional">
      <ContentTemplate>
        <asp:Placeholder ID="ph" runat="server" />
      </ContentTemplate>
      <Triggers>
        <asp:AsyncPostBackTrigger ControlID="buttonB" EventName="Click" />
      </Triggers>
    </asp:UpdatePanel>