我在想。如果我的表单分为允许用户上传各种文件的步骤,我可以将这些文件作为二进制数据保存在TempData中吗?
我需要能够将文件保存到磁盘,并将其保存到数据库中。
我有一个用于ViewModel的index.cshtml,在每个帖子上显示一个类型为IStepViewModel
的ViewModel属性的编辑器。因此每一步代表要收集的总数据的一部分。
通过这种方式,我可以管理1个index.cshtml页面,并按照我想要的步骤进行操作。
客户需要一些步骤来允许上传,而其他人则不需要。他们还希望上传是Ajaxy,这意味着在步骤可能不完整时发布。
我希望能够在最后的审核步骤中,让他们知道您正在考虑上传的文件......直到他们点击最终的TRANSMIT
文件在TempData中,这种方式我认为我可以进行一次原子操作。
操作将是
- 将所有表单数据再次保存到DB
- 使用transmitted
的位标记标记数据库记录
- 将文件保存到我们的服务器上
也许我应该采取完全不同的方法......如果是这样,请告诉我。
答案 0 :(得分:1)
TempData
存储在会话中,但只会存储到下一个请求,因此很有可能会丢失您存储在那里的任何内容。这不是打算使用的方式。
从您的用户的角度来看,他们的操作的原子性并不像几乎一样重要,因为他们确保数据不会意外丢失。作为用户,当我必须查找大量信息以填写表单时,我讨厌它,然后在我点击“完成”之前发现我的会话超时。
我建议你模拟用户在数据存储中进行的进度(在这种情况下可能是数据库和文件存储的组合)。让用户上传文件,并将文件保存到特定位置。使数据库具有表示其填写的各种表单数据的模型,并引用用户已上载的文件。当用户完成最后一步时,您可以在数据库中将向导标记为“完成”,这样就完成了到目前为止所做的所有事情。
您可以决定是否希望用户在一段时间内处于非活动状态后能够“继续”向导,或者您是否希望制定一个策略,告知用户之后任何向导不完整的向导会话结束可以免费删除。
我没有意识到TempData
的行为发生了变化,但是现在项目一直存在,直到它们从TempData
读出,或者直到会话到期为止。这使得数据的波动性比以前略有下降,但是保留用户花费时间输入和上传的数据仍然是一个危险的地方。
答案 1 :(得分:1)
TempData使用会话存储来存储数据,因此任何可以序列化的东西都可以保存在那里。
但是,在您的情况下,保存会话存储中的文件可能不是一个好主意,因为您可以轻松地耗尽内存。
解决方案将用于基于临时文件的存储(您甚至可以实现temp db/file based session store。
这样可以避免多次访问DB和DB上不必要的I / O.
您还可以将SQL Server作为会话的后备存储或其他持久保存临时数据的数据库(oracle)。这样,您的应用就可以处理TempData,并且不知道临时文件的存储方式。