1

你好,

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

当用户再次点击提交时,视图类将不包含有关存储文件的任何数据。最佳实践如何?

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

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

请指教

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

4

2 回答 2

2

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

于 2011-02-01T09:18:27.637 回答
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/

于 2011-02-01T09:20:01.233 回答