2012-03-03 80 views
0

我有一个ASP.Net创建用户向导。我包含的其中一个额外步骤是收集客户可能与其同事建立连接的联系信息,以便配置的帐户也可以批量创建登录。我用于ContactPerson的用户由多个用于关键信息(名称,DoB,公司名称,地址和州)的文本框组成。建议:坚持用户输入动态创建用户控件

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

此用户控件映射到EF4实体,具体而言,该页面有一个名为List ContactList的成员。我想问一下,如果我遇到从前面的联系人收集到的实体数据,并且在遇到回发时重新添加用户控件(包含所述数据)返回到表单,那么最佳方式是什么?

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

回答

2

直到你坚持你的数据,你可以使用HttpContext.Current。 Session存储此信息的对象。会话(存储在服务器上)适用于较大的数据,因此可以将较小的数据用于存储在页面的隐藏字段中的ViewState,因为每次请求都会发送来回数据并快速打开页面大小。为了讨论见ViewState Vs Session ... maintaining object through page lifecyclehttp://msdn.microsoft.com/en-us/library/ms972976.aspx

Annother选项(不是一个好您的具体情况)可以像具有好处是可以复制的URL粘贴到电子邮件,仍然有ID或主键非常小的数据QueryParameters信息。请参阅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

既然我们使用InProc会话状态,那么这种方法会有什么意想不到的后果吗?这看起来像是可行的答案,如果它与InProc一起工作。 – jjhayter 2012-03-04 03:49:24

+0

存储在Session中的对象必须是[Serializable],无论如何它们是大多数对象,一些自定义需要[Serializable],一些实现序列化的更多工作...但我们不要超前。你有一个很好的机会,它会正常工作! InProc会话受限于在IIS中配置的可用内存。但只要你临时存储这些对象,而不处理1000个用户同时注册 - 我不会担心这一点。如果你需要更多的会话空间,研究SQLSession将是一种选择。 – Elementenfresser 2012-03-04 07:02:21

0

您将需要除非你坚持使用一个中间存储位置和检索数据的数据库,每一个请求(我觉得呆板任何复杂的业务应用程序)。

下面是我如何处理它。

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

动态控件将直接添加到页面的模型中或添加到后代。此方法轻松支持简单或复杂的对象结构,并且还允许在页面之间共享数据。