1

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


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

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

每当单击导致回发的按钮 A 或 B 时,子用户控件都会丢失状态。UpdatePanels 的模式已设置为有条件的。

在 OnPageLoad 中,

  1. 我将子控件加载到 PlaceHolderA
  2. 这个子控件有另一个带有很多 JS 的用户控件。用户可能会在子控件中进行更改。
  3. 当他们单击作为父控件一部分的按钮 A 时,OnPageLoad 会导致子控件重新加载,从而导致它丢失用户所做的客户端更改。

我想防止这种情况发生。

这是 ASPX 页面的 HTML 结构

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

4

5 回答 5

1

动态添加控件时,您需要在每次页面加载时重新添加它们。我不得不解决类似的困难,我通过两种方式做到这一点。在动态添加动态字段的地方,我实际上会在用户单击以填充或自己添加之前将隐藏控件添加到页面。通过创建这种占位符,系统有时间开始正确处理视图状态,这会保留用户的更改。我听到您提到的第二个问题是 chich 更新面板更新可能存在问题。可以将它们设置为有条件但在您的代码隐藏中,如果您需要从代码中触发更新,您还可以触发其他面板中的更新。这只是更新面板#.update()

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

于 2009-02-05T17:09:42.917 回答
1

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

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

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

于 2009-02-10T16:42:34.250 回答
0

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

Blockquote //Web服务类中的代码

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

从我的页面脚本中,我将对我的 web 服务执行 Ajax,而回调 EndHelloWorld 你可以在不丢失状态的情况下做任何事情。

希望它有所帮助...亲切的问候。何塞马。

于 2009-01-29T16:10:38.687 回答
0

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

这样你就没有回帖了。

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

问候。何塞马。 http://www.learning-workshop.com

于 2009-01-29T15:49:03.613 回答
0

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

<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>
于 2009-01-29T16:16:45.073 回答