2011-04-16 76 views
1

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

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

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

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

从我所了解的控制器实例只能持续一个请求。那么我应该在包含所有最新上传的联系人模型对象集合的联系人控制器上创建一个静态属性?然后有一些过程定期检查这些集合的年龄,并清除那些比指定的过期时间早一些的年龄?

回答

0

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

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

但是,我会坚决推荐将上传的信息存储在数据库中。

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

根据存储数据的方式,这种情况下的数据可能会丢失。即使您将用户标识用作缓存键,服务器重新启动,缓存过期或缓存溢出也会导致数据丢失。

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

+0

我不关心丢失数据。如果用户上传文件,并且他们的浏览器崩溃,如果他们不得不再次上传文件,那么它不是世界的尽头。怎么样使用TempData或Session?尽管如果我使用会话状态模式,然后在proc我的UploadData模型对象将需要可序列化正确吗?如果它有什么不同,这些上传的文件大约200kb到1mb。当然,我可能只是在想这个,因为这是我第一个ASP.NET网站。 – 2011-04-17 00:45:23

+0

'TempData'基本上是会话周围的一个包装器,它会自动删除下一个请求AFAIK中的信息。重点不在于再次上传文件:这是**编辑失去了 - 这可能是非常烦人的。对象不需要可序列化 - 毕竟,它们没有被序列化。 1MB不是太小。我真的不明白你为什么不写这个数据库。 – mnemosyn 2011-04-17 00:57:29

+0

那么我结束了一个稍微不同的解决方案。当用户上传文件时,服务器只保存文件,并触发线程池上的工作项目以实际读取文件并将数据加载到数据库中。这样,当服务器读取文件时,这个用户不会等待他们的浏览器响应。 – 2011-05-26 18:23:12

1

控制器上的静态属性有问题。首先,它不适用于网络农场,其次它必须处理来自不同用户的多个请求。如果你真的不想使用你的数据库,你可以使用ASP.NET Session。

+0

是的静态属性似乎是一个坏主意。我应该使用Session还是TempData?我正在阅读有关两者,但不确定其中的差异。 – 2011-04-17 00:16:01

+0

@Eric Anastas - http://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc – jfar 2011-04-17 01:47:59

1

不,您不需要静态属性,因为对于控制器的所有实例(即使对于其他用户来说)都是静态的。

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

0

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

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

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

相关问题