【发布时间】:2013-01-08 13:30:13
【问题描述】:
我有一个只包含一个文本框的用户控件,在另一个表单上我动态添加了这个用户控件,用户可以多次添加用户控件。我使用会话变量来重新创建用户控件(也许这种方法听起来不太酷)。重新创建控件后,文本框的值显然消失了。是否有任何解决方案可以在回发时保持用户控件的状态?
【问题讨论】:
-
视图状态是首选方法。
标签: c# asp.net user-controls
我有一个只包含一个文本框的用户控件,在另一个表单上我动态添加了这个用户控件,用户可以多次添加用户控件。我使用会话变量来重新创建用户控件(也许这种方法听起来不太酷)。重新创建控件后,文本框的值显然消失了。是否有任何解决方案可以在回发时保持用户控件的状态?
【问题讨论】:
标签: c# asp.net user-controls
如果您在正确的Page Life Cycle 事件(PreInit) 期间将动态控件添加回控件,它们将通过IPostBackDataHandler 接口保持其状态。
PreInit - 创建或重新创建动态控件。
【讨论】:
null。那么如何将动态控件添加到例如为空的Placeholder 控件?
我过去也遇到过同样的问题。
我所做的是给动态添加的控件一个 ID,并确保它在回发时也保留该 ID(在我的情况下,我将所有信息保留在会话中,并重新创建了控件)。
一旦回发控件具有与以前相同的 ID,Microsoft 就会变魔术并使用回发前值重新填充控件。
【讨论】:
使用对象缓存。将用户控件添加到缓存中,并在需要时检索它。
你可以在ASP.net-Tutorials Cache and Object Cache.看到一个很好的例子:ASP.net-Tutorials Cache and Object Cache.
我现在也在学习asp.net,发现这个解释很好。我还使用了Microsoft Library
【讨论】:
每个继承 IPostBackDataHandler 接口的服务器控件都有一个处理回发数据的 LoadPostData 方法。当控件由一个类(页面、表单、占位符、控件等)实现时,该类调用 LoadPostData 方法并传递发布的数据和键以维护控件状态。
您只需在每次回发期间在页面加载事件之前或之内重新实例化/重新初始化动态控件,然后将此控件添加到页面/表单/占位符。然后通过父控件调用LoadPostData方法,将发布的数据自动分配给控件。
查看这篇文章以了解如何编写动态控制代码 - How to maintain dynamic control events, data during postback in asp.net
【讨论】: