【问题标题】:ASP.NET MVC2 Save data between actions?ASP.NET MVC2 在操作之间保存数据?
【发布时间】:2011-02-01 09:07:39
【问题描述】:

嗨,

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

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

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

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

请指教

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

【问题讨论】:

  • 关于第三点 - 您仍然可以在 ASP.NET MVC 中使用 HttpContext.Current.Cache,就像在 ASP.NET WebForms 中使用它一样。
  • Grate!,但是第三点会比第二点更好吗?如果是这样,为什么?

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


【解决方案1】:

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

【讨论】:

  • 谢谢,这将如何扩展?为什么这比拥有一个为所有用户保存数据的通用单点更好?
  • TempDataDictionary 实例旨在为单个请求持续存在。你可以使用单例,但是一旦你完成了项目,你就必须管理它们的清理和删除。
【解决方案2】:

我使用 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多