0

我在这里问了一个先前的问题,其中一部分似乎本身就是一个完整的主题。

我正在尝试跨控制器调用保留文件数据。

场景是:用户上传包含要提交到数据库的条目的文件。如果文件有警告和错误,它们将被重定向到验证页面。如果没有警告或错误,他们的文件将被直接处理。

如果用户收到警告但没有错误(即文本字段太长并且将被截断),他们仍然可以导入文件。由于在上传文件和将其发送到数据库之间有两个单独的屏幕,因此需要保留文件数据。

我已经看到了十几个与此类似的问题,但似乎都没有相关的答案(因此,如果类似的问题没有对这个确切问题的答案,请不要将此问题标记为重复)。

我的第一个想法是使用上传的文件名 + guid 保存文件并将该文件名保存到会话状态,但是我在上一个问题上得到的答案都非常坚定地认为这是一个糟糕的解决方案。

我发现的其他类似问题的解决方案:

  1. 重新上传文件(一个糟糕的解决方案)
  2. 使用 viewbag 将文件名发送到视图,以发送回第二个控制器(听起来不对)
  3. 保存视图模型中的文件位置以发送到视图,由第二个控制器再次检索(再次听起来不正确)
  4. 将文件位置保存在会话或临时数据中(收到一般不利的评论)

我已经完成了我的研究,但找不到解决此问题的最佳方法。有人可以帮帮我吗?如果您认为另一个问题回答了这个问题,请您将其作为答案发送给我,而不是将此作为重复报告,因为我已经进行了大量搜索。

谢谢你,塞缪尔戴维斯

编辑:我的用户确实有一个可用的会话。我能想到的另一个解决方案是将硬编码字符串附加到包含在其会​​话 ID 中的 GUID,例如。“MyImporter-xxxx.xxxx.xxxx.xxxx.csv”。这样,“MyImporter”可以是一个私有常量字符串,我的控制器不必保留任何标识符。我不确定这种方法有什么缺点,但是由于我对 MVC 很陌生,所以肯定会有我没有想到的情况。

4

2 回答 2

1

最好的办法是将文件的位置存储在您的服务器上。会话或数据库。

流动:

  1. 用户上传文件
  2. 服务器将文件存储在服务器上的某个位置,并将该文件的位置存储在 Session 变量或数据库中
  3. 用户发送第二个请求
  4. 服务器从会话或数据库中检索位置。
  5. 服务器对文件做一些事情

值得一提的是,如果您决定将文件位置存储在数据库中,您还应该将当前经过身份验证的用户存储在同一个表中,以便您以后可以检索到正确的记录。如果您不使用身份验证,这可能不是一个好的解决方案,因为您将无法检索记录。在这种情况下,您可以在数据库中使用难以猜测的标识符来存储文件位置。然后这个标识符将被传递给视图(当然是在视图模型的形式下)并在后续请求中传递。重要的是,该标识符难以猜测,以避免一个用户使用另一个用户的文件。

另一种可能的解决方案可能是将文件的位置存储在加密的 cookie 中,该 cookie 将在后续请求中发送。

于 2012-12-13T20:06:14.353 回答
0

你听说过TempData吗?它就像一个自毁的会话值。

于 2012-12-13T20:04:48.697 回答