2009-01-29 56 views
1

我有一个具有多个更新面板多的UpdatePanel和国家


在页面加载的用户控件,我动态地加载一个子用户控件拖到占位符(我每次做这个,不要检查回传)

我想能够保持状态用户在Child用户控件中所做的更改。 (子用户控件包含html控件以及asp.net控件和其他自定义控件)。

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

在的onPageLoad,

  1. 我打开一个子控件的PlaceHolderA
  2. 这个孩子的控制有很多JS的另一用户控制。用户可能会对子控件进行更改。
  3. 当他们点击作为父控件一部分的按钮A时,OnPageLoad会导致子控件重新加载,导致它失去用户所做的客户端更改。

我想阻止这种情况发生。

这里的ASPX页面

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

回答

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。

0

它看起来像你需要删除嵌套的UpdatePanels。在这样的结构:

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

全部的更新面板会随时更新,即使孩子的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> 
1

当动态添加控件则需要重新每次加载页面时添加它们。我必须解决类似的困难,我以两种方式做到这一点。在添加动态字段的同时,我实际上会在用户单击以填充或添加它之前向页面添加一个隐藏控件。通过创建这种占位符,系统开始正确处理viewstate,并保留用户更改。我听到你提到的第二个问题是,chich更新面板更新可能存在问题。让他们设置为有条件地编写代码是很好的 - 如果你需要从代码中获取更多信息,你也可以触发其他的更新。这只是更新面板#.update()

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

1

看起来你失去了动态添加的子控件的ViewState。

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

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