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

C# 建议:为动态创建的用户控件保留用户输入,c#,asp.net,user-controls,persistence,postback,C#,Asp.net,User Controls,Persistence,Postback,我有一个ASP.Net创建用户向导。我包括的另外一个步骤是收集客户与同事的联系信息,以便配置的帐户也可以批量为他们创建登录。我用于ContactPerson的用户由几个文本框组成,用于输入关键信息(姓名、DoB、公司名称、地址和状态) 我使用一个简单的按钮来调用AddContacts方法,该方法创建用于RadPanelItems的适当嵌套结构。一旦我添加了第一项,它就可以正常工作,但第二项通过回发和缺少数据持久性来清除第一项 此用户控件映射到EF4实体,特别是该页面有一个名为List Conta

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

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

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


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

在保存数据之前,您可以使用HttpContext.Current.会话对象存储此信息。会话(存储在服务器上)更适合于较大的数据,视图状态(存储在页面上的隐藏字段中)可用于较小的数据,因为它会在每次请求时来回发送,并快速放大页面大小。有关讨论,请参阅或

Annother选项(对于您的情况来说不是一个好选项)是针对非常小的数据(如ID或主键)的QueryParameters,其优点是您可以将url复制粘贴到电子邮件中,并且仍然保留信息。看

回到你的问题上来:对于你添加的每一个新联系人,执行类似的操作,直到你最终保存你的数据

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
var contacts=新列表()
如果(会话[“联系人”]!=null){
联系人=会话[“联系人”]作为列表
}
var newContact=newef4entity()
//在这里填写您的新联系人
联系人。添加(新联系人)
//在这里绑定您的项目
//将其存储到会话中
会话[“联系人”]=联系人

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

以下是我的做法

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


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

由于我们使用InProc会话状态,这种方法是否会产生意外后果?如果它与InProc一起工作,这似乎是可行的答案。存储在会话中的对象必须是[Serializable],这是大多数对象,不管怎样,一些定制的对象需要[Serializable],一些实现序列化的工作要多做一点……但我们不要做太多。你有一个很好的机会,它将只是工作良好!InProc会话受IIS中配置的可用内存限制。但只要您暂时存储对象,并且不需要同时处理1000多个注册用户,我就不会担心这一点。如果您需要更多的会话空间,查看SQLSession将是另一种选择。。。