我刚刚开始学习ASP.NET MVC,我想知道如何在后续对控制器操作方法的请求之间保留模型对象?如何在使用ASP.NET MVC的请求之间持久化对象?
例如说,我正在创建一个联系人列表Web应用程序。用户可以在列表中创建,更新,重命名和删除联系人。但是,我也希望用户能够上传从其他程序导出的联系人列表。然而,我不想只是自动添加上传文件中的所有联系人,我想给用户一个辅助表格,他们可以选择哪些上传的联系人应该实际添加到他们的列表中。
所以首先我有一个ContactController.Upload()
方法,它显示一个上传表单。这提交至ContactController.Upload(HttpPostedFileBase file)
,该文件读取发布到一组Contact模型对象中的文件。然后我想要显示列表中所有联系人的名称列表,并允许用户选择应添加到联系人列表中的联系人列表。这可能是一个很长的列表,需要分成多个页面,我也可能希望允许用户在联系人实际添加到他们的联系人列表之前编辑联系人的详细信息。
我应该在用户上传文件和最终提交他们想要的特定联系人之间保存模型对象?我宁愿不立即将所有上传的联系人加载到后端数据库中,因为用户可能最终只选择一小部分来实际添加。其余的则需要删除。另外,我必须考虑用户上传文件时的情况,但从未实际完成上传。
从我所了解的控制器实例只能持续一个请求。那么我应该在包含所有最新上传的联系人模型对象集合的联系人控制器上创建一个静态属性?然后有一些过程定期检查这些集合的年龄,并清除那些比指定的过期时间早一些的年龄?
我不关心丢失数据。如果用户上传文件,并且他们的浏览器崩溃,如果他们不得不再次上传文件,那么它不是世界的尽头。怎么样使用TempData或Session?尽管如果我使用会话状态模式,然后在proc我的UploadData模型对象将需要可序列化正确吗?如果它有什么不同,这些上传的文件大约200kb到1mb。当然,我可能只是在想这个,因为这是我第一个ASP.NET网站。 – 2011-04-17 00:45:23
'TempData'基本上是会话周围的一个包装器,它会自动删除下一个请求AFAIK中的信息。重点不在于再次上传文件:这是**编辑失去了 - 这可能是非常烦人的。对象不需要可序列化 - 毕竟,它们没有被序列化。 1MB不是太小。我真的不明白你为什么不写这个数据库。 – mnemosyn 2011-04-17 00:57:29
那么我结束了一个稍微不同的解决方案。当用户上传文件时,服务器只保存文件,并触发线程池上的工作项目以实际读取文件并将数据加载到数据库中。这样,当服务器读取文件时,这个用户不会等待他们的浏览器响应。 – 2011-05-26 18:23:12