在第二页上编辑大的导入文件

时间:2009-11-15 19:52:08

标签: asp.net-mvc

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

问题可能是:

  • 最好将已解析的文件存储在Session中吗?
  • 将解析后的数据推送到客户端的页面然后再接收它会更好吗?

以下是示例:

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);
}

显然,选项#2的副作用较少,因为它没有全局状态。但是在选项#1中,我们不会将大量无用的用户数据推送到客户端。这可能很多。

当然这个问题并不新鲜,而且一如既往,答案是:它取决于。

我必须承认,我没有任何确切的问题。我甚至不知道为什么我不喜欢只需要几行代码的Session解决方案。我问的原因是我读过关于Weblocks概念的内容并且给我留下了深刻的印象。所以,我试图在ASP.NET MVC中发明类似的东西,却没能。因此,我想知道,有没有优雅的方式来处理这种情况?优雅我的意思是没有显示它使用Session,易于使用,处理到期(如果用户没有按下最后的“保存”按钮清理会话),等等的东西,如:

var data = parse(filestream);
var confirmationPostData = ShowView("Confirm", data);
items = items.Where(confirmationPostData of same name selected);
items.ForEach(set name to confirmationPostData name);

这里ShowView实际发送GET,等待用户的POST,然后返回。的种类。我并不坚持,我只是展示给我留下深刻印象的方式(在Weblocks中 - 如果我确实理解它的话)。

在这种情况下,每个人都只使用Session吗?或者有更好的方法(除了学习LISP,我已经开始调查,如果我可以应对)?也许,MVC v2中的异步操作可以做到吗?

更新:存储在DB / temp文件中,它可以工作。我有时会存储在DB中。然而,这需要一种使数据到期的方法,因为用户可能只是放弃它(就像关闭浏览器一样简单)。我要求的是:是否有一种经过验证的优雅方式来解决它 - 而不是如何做到这一点。基于序列化构建的抽象不依赖于特定的DB /文件实现,类似这样。

2 个答案:

答案 0 :(得分:2)

我不确定上传Excel文件的目的是什么,但我喜欢让所有影响应用程序长期状态的操作,对于用户来说都是持久的。例如,如果用户上传文件,更改几个选项,然后去吃午餐,该怎么办?如果您将信息存储在会话中,它们可能会在它们返回时消失,同样将它存储在具有隐藏变量的页面中。把它存放在DB中怎么样?

答案 1 :(得分:0)

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

// 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

由于我没有仔细阅读文档,因此我遇到了GetTempFileName的漏洞。它表示如果temp文件夹中有超过65535个文件,该方法将开始抛出异常。因此,请记住在完成处理后始终删除临时文件。

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