建议:为动态创建的用户控件保留用户输入

本文关键字:用户 控件 保留 输入 创建 动态 建议 | 更新日期: 2023-09-27 18:26:36

我有一个ASP.Net创建用户向导。我包括的另一个步骤是收集客户与同事之间的联系信息,以便配置的帐户也可以为他们批量创建登录。我为ContactPerson使用的用户由几个文本框组成,用于显示关键信息(名称、DoB、公司名称、地址和州)。

我使用一个简单的按钮来调用AddContacts方法,该方法创建用于RadPanelItems的正确嵌套结构。只要我添加第一个项目,它就可以正常工作,但第二个项目通过回发和缺乏数据持久性删除了第一个项目。

此用户控件映射到EF4实体,特别是页面有一个名为List ContactList的成员。我想问,当遇到回邮时,对我来说,保持我从上一次联系人收集的实体数据,以及将我的用户控件(包括所述数据)重新添加回表单的最佳方式是什么?

我愿意接受建议,并正在寻找最佳实践解决方案。提前谢谢。

建议:为动态创建的用户控件保留用户输入

在持久化数据之前,您可以使用HttpContext.Current.Session对象来存储此信息。Session(存储在服务器上)更适合较大的数据,ViewState(存储在页面的隐藏字段中)可以用于较小的数据,因为它在每次请求时都会来回发送,并会迅速增大页面大小。有关讨论,请参阅ViewState与Session。。。在页面生命周期中维护对象,或http://msdn.microsoft.com/en-us/library/ms972976.aspx

另一个选项(不适合您的情况)是QueryParameters,用于ID或主键等非常小的数据,其优点是您可以将url复制粘贴到电子邮件中,并且仍然拥有信息。看见http://www.codeproject.com/Articles/5876/Passing-variables-between-pages-using-QueryString

回到你的问题:对于你添加的每一个新联系人,都要执行这样的操作,直到你最终保存你的数据。

var contacts = new List<EF4Entity>()
if (Session["Contacts"] != null){
  contacts = Session["Contacts"] as List<EF4Entity>
}
var newContact = new EF4Entity()
//fill your new contact here
contacts.Add(newContact)
//bind your RadPanelItems here
//store it to the session
Session["Contacts"] = contacts

您将需要使用一个中间存储位置,除非您坚持并在每次请求时将数据检索到数据库中(我发现这对于任何复杂的业务应用程序来说都是不灵活的)。

以下是我的处理方法。

我已经编写了一个关于ASP.Net会话的包装器,以确保我有唯一的对象密钥,并且我可以强制每个用户在会话中使用最大数量的对象。我的每个页面都绑定到一个实现简单接口的对象(我称之为IModel)。通过这种方式,我可以一致地处理每个页面/视图的模型,并且可以使任何页面状态都能感知。

动态控件直接附加到页面的模型或子体。这种方法轻松支持简单或复杂的对象结构,还允许在页面之间共享数据。