Asp.net mvc 在第二页上编辑导入的大文件

Asp.net mvc 在第二页上编辑导入的大文件,asp.net-mvc,Asp.net Mvc,这主要是一个理论问题,因为我实际上可以以任何方式实现它,但这让我有点困惑。因此,假设我向用户提供一个页面,用于选择Excel文件,然后将其上载到服务器。服务器代码解析该文件,并向用户显示另一个包含许多选项的页面。用户可以选择和取消选择其中的一些选项,编辑名称,然后单击“确定”-之后服务器只需处理选定的选项 问题可能是: 将解析后的文件存储在会话中是否更好 将解析后的数据推送到客户端页面,然后再接收回来是否更好 下面是一个例子: public class Data { public st

这主要是一个理论问题,因为我实际上可以以任何方式实现它,但这让我有点困惑。因此,假设我向用户提供一个页面,用于选择Excel文件,然后将其上载到服务器。服务器代码解析该文件,并向用户显示另一个包含许多选项的页面。用户可以选择和取消选择其中的一些选项,编辑名称,然后单击“确定”-之后服务器只需处理选定的选项

问题可能是:

  • 将解析后的文件存储在会话中是否更好
  • 将解析后的数据推送到客户端页面,然后再接收回来是否更好
下面是一个例子:

public class Data
{
   public string Name { get; set; } // shown to user, can be changed
   public bool Selected { get; set; } // this is in ViewModel but anyway
   public string[] InternalData { get; set; } // not shown to user
}

// 1st option is to receive data via POST
public ActionResult ImportConfirmed(IList<Data> postitems)
{
   // 2nd option is to receive only user changes via POST
   var items = Session["items"] as IList<Data>;
   items = items.Where(postitems of same name selected);
   items.ForEach(set name to postitems name);
}
在这里,ShowView实际上发送GET,等待用户的帖子,然后返回。有点我不坚持,我只是展示给我留下深刻印象的方式(在Weblocks中——如果我真的理解正确的话)

在这种情况下,每个人都只使用会话吗?或者有没有更好的方法(除了学习LISP,我已经开始研究它是否可以应付)?也许MVC v2中的异步操作可以做到这一点


更新:存储在DB/temp文件中,可以正常工作。我有时确实存储在数据库中。然而,这需要一种使数据过期的方法,因为用户可能会放弃它(就像关闭浏览器一样简单)。我想问的是:有没有一种行之有效的优雅方法来解决这个问题,而不是如何解决。在序列化的基础上构建的抽象,与特定的DB/文件实现无关,类似于这样。

我不确定上传Excel文件的目的是什么,但我喜欢让所有影响用户应用程序长期状态的操作保持不变。例如,如果用户上传文件,更改几个选项,然后去吃午饭,该怎么办。如果您将信息存储在会话中,当他们返回时,信息可能会消失,同样,将信息存储在带有隐藏变量的页面中也是如此。如何将其存储在数据库中?

我将文件存储在临时文件夹中,并且仅将文件名与用户会话关联,以便以后可以对其进行处理:

// Create a temp file in the Temp folder and return its name:
var tempFile = Path.GetTempFileName();
// write to the temp file and put the filename into the session
// so that the next request can fetch the file and process it
我曾经遇到过一个缺陷,因为我并没有仔细阅读文档。它说,如果临时文件夹中的文件超过65535个,该方法将开始抛出异常。因此,请记住,在处理完临时文件后,一定要将其删除


临时文件夹的另一种替代方法是将文件存储到数据库中,但我对将文件存储在关系数据库中有点怀疑。

我同意,我会将数据持久化到数据库中,并显示一个包含导入记录和错误的摘要屏幕。在另一个屏幕上检索名称并让用户选择它进行进一步处理,将内部数据保留在数据库中。有时将可能兆字节的数据推到页面上确实是个坏主意。然后用户仅仅关闭浏览器(或者它崩溃)——数据会永远留在数据库中吗?是的,有很多方法可以跟踪它-我自己做-但是有没有任何通用的方法或库,使一千名程序员不会每天重新发明它?请参阅更新。至于文件,正如我说的,它是关于解析数据的,所以实际上数据结构是要存储的——也就是IList。但这并不重要。
// Create a temp file in the Temp folder and return its name:
var tempFile = Path.GetTempFileName();
// write to the temp file and put the filename into the session
// so that the next request can fetch the file and process it