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

时间:2012-03-03 07:51:18

标签: c# asp.net user-controls persistence postback

我有一个ASP.Net创建用户向导。我包含的其中一个附加步骤是收集客户可能与其他同事建立联系的联系信息,以便正在配置的帐户也可以为他们批量创建登录。我用于ContactPerson的用户包含几个用于密钥信息的文本框(名称,DoB,公司名称,地址和状态)。

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

此用户控件映射到EF4实体,特别是该页面具有名为List ContactList的成员。我想问一下,对于我来说,最好的方法是保留我从上一次联系中收集的实体数据,并在遇到回复时将我的用户控件(带有所述数据)重新添加回表单?

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

2 个答案:

答案 0 :(得分:2)

在您持久保存数据之前,您可以使用HttpContext.Current。会话对象来存储此信息。会话(存储在服务器上)对于较大的数据更好, ViewState (存储在页面上的隐藏字段中)可用于较小的数据,因为它在每次请求时来回发送并快速炸毁页面大小。有关讨论,请参阅ViewState Vs Session ... maintaining object through page lifecyclehttp://msdn.microsoft.com/en-us/library/ms972976.aspx

Annother选项(不适合您的情况)是QueryParameters,用于非常小的数据,如ID或主要密钥,其优点是可以将网址粘贴到电子邮件中并且仍然具有信息。见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

答案 1 :(得分:0)

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

以下是我如何处理它。

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

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