多个UpdatePanel和状态

时间:2009-01-29 15:44:08

标签: asp.net ajax asp.net-ajax updatepanel user-controls

我有一个具有多个更新面板的用户控件

                                              

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

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

只要点击按钮A或B导致回发,子用户控件就会丢失状态。 UpdatePanels的模式已设置为条件。

在OnPageLoad中,

  1. 我将一个子控件加载到PlaceHolderA
  2. 这个子控件有另一个用户控件,里面有很多JS。用户可以在子控件中进行更改。
  3. 当他们点击作为父控件一部分的Button A时,OnPageLoad会导致子控件重新加载,导致它丢失用户所做的客户端更改。
  4. 我想防止这种情况发生。

    这是ASPX页面的HTML结构

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

5 个答案:

答案 0 :(得分:1)

动态添加控件时,每次页面加载时都需要重新添加控件。我必须解决类似的困难,我这样做有两种方式。在动态字段添加的情况下,我会在用户点击填充或自行添加之前向页面添加隐藏控件。通过创建这种占位符,系统可以开始正确地处理视图状态,这样可以保留用户的更改。我听到你提到的第二个问题是chich更新面板更新可能存在问题。可以将它们设置为有条件的代码,如果需要代码,也可以在rpanel中触发更新。它只是updatepanel#.update()

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

您可以在控件中使用带有表单runat服务器的ScriptManager,而不是更新面板。

这样你就没有回帖了。

这是一个很好的参考:http://www.asp.net/Ajax/Documentation/Live/overview/ScriptManagerOverview.aspx

问候。 Josema。 http://www.learning-workshop.com

答案 3 :(得分:0)

  

块引用   // Asp.Net代码中的代码

<form runat="server" id="form1">
           <asp:ScriptManager id="ScriptManager1" runat="server" >
                 <Services>
                    <asp:ServiceReference Path="/WebServices/MyService.asmx"/>
                 </Services>
            </asp:ScriptManager> 
        </form>    
            <script language="javascript" type="text/javascript">
                //call with namespace "WebSite" included 
                WebSite.WebServices.HelloWorld(EndHelloWorld);


                function EndHelloWorld()
                {
                    //do whatever
                }
            </script>    
    </form>
  

块引用   // Web服务类中的代码

[ScriptService]
    public class MyService : System.Web.Services.WebService
    {
        [WebMethod]
        public void HelloWorld()
        {
           return "Hello world";
        }            
    }

从我的页面脚本中我将对我的web服务进行Ajax,并且回调EndHelloWorld你可以做任何事情而不会失去状态。

希望它有所帮助...... 亲切的问候。 Josema。

答案 4 :(得分:0)

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

<ParentUpdatePanel>
  <ChildUpdatePanel1 />
  <ChildUpdatePanel2 />
</ParentUpdatePanel />

即使子UpdatePanels设置为条件,所有更新面板也将一直更新,因为父实际上是更新的。因此,其中一个子项中的回发事件将导致父级更新。

使用这种类型的模式通常很糟糕......如果你需要一个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>