我有一个只包含一个文本框的用户控件,在另一个表单上我动态添加了这个用户控件,用户可以多次添加用户控件。我使用会话变量来重新创建用户控件(也许这种方法听起来不太酷)。重新创建控件后,文本框的值显然消失了。是否有任何解决方案可以在回发时维护用户控件的状态?
4 回答
If you add dynamic controls back to the control during the correct Page Life Cycle event(PreInit
) they will maintain their state through the IPostBackDataHandler
interface.
PreInit - Create or re-create dynamic controls.
我过去也遇到过同样的问题。
What I did was give the dynamically-added control an ID, and made sure it retained that ID also on postback (in my case, I kept all the information in the session, and re-created the controls).
Once the postbacked control has the same ID as as before, Microsoft did magic and refilled the controls with the pre-postback values.
使用对象缓存。将用户控件添加到缓存中,并在需要时检索它。
您可以在以下位置看到一个很好的示例:ASP.net-Tutorials Cache 和 Object Cache。
我现在也在学习asp.net,发现这是一个很好的解释。我还使用了Microsoft Library
每个继承IPostBackDataHandler接口的服务器控件都有一个处理回发数据的LoadPostData方法。当控件由一个类(页面、表单、占位符、控件等)实现时,该类调用LoadPostData方法并传递发布的数据和键以维护控件状态。
您需要做的就是在回发期间每次在页面加载事件之前或之内重新实例化/重新初始化动态控件,并将此控件添加到页面/表单/占位符。然后通过父控件调用 LoadPostData 方法,将发布的数据自动分配给控件。
查看这篇文章了解如何编写动态控件的代码 - 如何在asp.net中回发期间维护动态控件事件、数据