如何在ASP.NET MVC的请求之间保留对象?

时间:2011-04-16 23:11:43

标签: asp.net-mvc

我刚刚开始学习ASP.NET MVC,我想知道如何在后续的控制器操作方法请求之间保留模型对象?

例如说我正在创建一个联系人列表Web应用程序。用户可以在其列表中创建,更新,重命名和删除联系人。但是,我还希望用户能够上传从其他程序导出的联系人列表。但我不想只是自动添加上传文件中的所有联系人我想给用户一个辅助表格,他们可以选择哪些上传的联系人应该被实际添加到他们的列表中。

首先,我有一个显示上传表单的ContactController.Upload()方法。这提交到ContactController.Upload(HttpPostedFileBase file),它读取发布到一组Contact模型对象中的文件。然后,我想显示列表中所有联系人姓名的列表,并允许用户选择应添加到其联系人列表中的联系人。这可能是一个需要拆分成多个页面的长列表,我可能还希望允许用户在联系人实际添加到联系人列表之前编辑联系人的详细信息。

在用户上传文件和最终提交他们想要的特定联系人时,我应该在哪里保存模型对象?我宁愿不立即将所有上传的联系人加载到后端数据库中,因为用户可能最终只选择少量实际添加。然后需要删除其余部分。此外,我还要考虑用户上传文件但从未实际完成上传的情况。

根据我的理解,控制器的实例仅持续一个请求。那么我应该在我的Contact控制器上创建一个包含所有最新上传的联系模型对象集合的静态属性吗?然后有一些流程定期检查这些集合的年龄,并清除任何比指定的到期时间更长的时间?

4 个答案:

答案 0 :(得分:1)

控制器上的静态属性很麻烦。首先,它不能在Web场中工作,其次,您必须处理来自不同用户的多个请求。如果您真的不想使用数据库,可以使用ASP.NET Session。

答案 1 :(得分:1)

不,您不需要静态属性,因为这对于控制器的所有实例都是静态的,即使对于其他用户也是如此。

相反,您应该创建一个用于上传数据的表。该表将用作用户上载数据和完成该过程之间的中介。完成后,将要保留的联系人复制到永久表中,然后删除临时数据。然后,您可以经常运行一个过程,以清除超过指定时间限制的不完整数据。

答案 2 :(得分:0)

你也可以使用支持到期(和滑动到期)的HttpContext.Cache开箱即用。

或者,也许甚至更好(但更多的工作)你可以使用cookie并让用户在她的浏览器中使用javascript修改数据,然后再发布给你。

但是,我强烈建议将上传的信息存储在数据库中。

正如您所指出的,它可能是大量数据,用户可能希望在单击“确认”之前对其进行编辑。如果用户的机器(或浏览器)崩溃或者她必须紧急离开会发生什么?

根据您存储数据的方式,此方案中的数据可能会丢失。即使您使用用户ID作为缓存键,服务器重新启动,缓存过期或缓存溢出也会导致数据丢失。

最佳解决方案可能是数据库和cookie存储的组合,其中数据库将信息保存在临时集合中。每隔 n 分钟或分页时,修改后的数据将被发送到服务器并在数据库中更新。

答案 3 :(得分:0)

将数据存储在会话或内存中的问题是,如果用户上传50k或更多联系人,会发生这种情况。然后,您在内存中有一个非常大的数据集来处理,这取决于您的平台可能会影响应用程序性能。

如果这永远不会成为问题并且导入的联系人列表的大小是可管理的,则可以使用会话或缓存来存储数据集以进行进一步修改。只需记住在用户提交更改时清除它,您不希望会话中出现一些繁重的数据集。

如果您使用应用程序控制器将数据集存储在会话中,那么在需要时它将可供所有控制器使用。