ASP.NET MVC2在动作之间保存数据?

时间:2011-02-01 09:07:40

标签: asp.net-mvc-2 session view temporary-files hidden-field

您好,

我有一个包含一些输入字段的视图,其中一些字段是常规文件输入。提交此视图表单时,文件将保存在临时文件夹中。但是,如果在服务端检测到验证问题,则将返回相同的视图(用于更新)。问题是文件输入不会再次填充(安全性),而是我必须扩展视图类并显示存储文件的小缩略图,并且还可以删除(以便能够上传另一个文件)。

当用户再次点击提交时,视图类将不包含有关存储文件的任何数据。对此最好的做法是什么?

我自己的想法是以下之一:

  1. 使用隐藏字段,但是当要存储的类很复杂并且它也不会受到保护时,这将很复杂。
  2. 使用Session来存储数据,我不知道这是一个好的还是坏的解决方案?
  3. 创建一个singelton类(如缓存),其中所有这些数据都将临时保存。 ASP.NET有一个缓存,你可以设置一个时间,直到释放chache,这将以相同的方式工作。
  4. 将广告保存为数据库中的临时广告,这意味着当视图返回时,它实际上是对已创建广告的修改,而不是编辑临时广告(不在数据库中)。问题可能是如果用户在第一次服务验证后中止,那么我们将在数据库中有一个未完成的广告。另一个减号是即使广告从未使用过,ID数(身份)也会增加。此解决方案的最后一个问题是广告表将包含不完整的广告。
  5. 请求建议

    我的解决方案: 我最终使用System.Web.Cache来保持请求之间的数据。创建并接受广告后,它将从缓存中删除并添加到数据库中。

2 个答案:

答案 0 :(得分:2)

您可以使用MVC的TempData功能。基本上TempData是基于会话的存储,它将数据缓存到下一个请求。您可以为每个请求存储一个现有文件列表,并在每次处理表单时将其保存到TempData(并随后将其读取)?

答案 1 :(得分:0)

我使用jquery表单插件解决了这个问题:http://jquery.malsup.com/form/

这样文件通过ajax发送(插件内部使用iframe),返回JsonResult(即你可以执行服务器端验证等),页面上的表单实际上没有变化,你可以在重新提交,无需再次选择文件。

注意:如果使用插件在MVC中返回JsonResult,则需要将JsonResult包装在“textarea”标记中。看一篇包含JsonResult并排除testarea异常的类的帖子:http://aspzone.com/tech/jquery-file-upload-in-asp-net-mvc-without-using-flash/