2009-11-15 50 views
0

这主要是理论上的问题,因为我实际上可以以任何方式实现它,但它让我困惑了一下。因此,假设我向用户提供一个页面来选择一个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); 
} 

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

当然这个问题并不新鲜,而且一如既往,答案是:这取决于。我不得不承认,我没有任何确切的问题。我甚至不知道为什么我不喜欢只需要几行代码的Session解决方案。我问的原因是我已经阅读了关于的概念,并且印象非常深刻。所以,我试图在ASP.NET MVC中发明类似的东西,但未能实现。因此,我想知道,是否有任何优雅的方式来处理这种情况?通过优雅的我意味着什么,这并不表明它使用会话,使用方便,操作到期(清理会话,如果用户不按最后的“保存”按钮),等喜欢的东西:

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,然后返回。有点。我不坚持,我只是展现给我留下深刻印象的方式(在网络锁定中 - 如果我确实了解它的话)。

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

更新:存储在DB /临时文件,它的工作原理。我有时用DB存储。然而,这需要一种数据过期的方式,因为用户可能会放弃它(就像关闭浏览器一样简单)。我所要求的是:是否有一种经过验证的优雅方式来解决它 - 而不是如何去做。一个建立在序列化之上的抽象,并不依赖于特定的DB /文件实现,就像这样。

回答

2

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

+0

我同意,我会坚持数据到数据库并显示导入记录和错误的摘要屏幕。用另一个屏幕检索名称并让用户选择它作进一步处理,将内部数据保存在数据库中。 – Decker97 2009-11-15 20:06:33

+0

推送可能兆字节的数据到页面有时是一个非常糟糕的主意。然后用户只关闭浏览器(或崩溃) - 数据会永远留在数据库中吗?是的,有办法跟踪它 - 我自己做 - 但是有没有常见的方法或库,以便一千个程序员不会每天都重复这个过程? – queen3 2009-11-15 20:21:52

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一大败笔因为我没有仔细阅读文档。它说,如果临时文件夹中有超过65535个文件,该方法将开始抛出异常。因此,请记得在完成处理后始终删除临时文件。

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

+0

查看更新。至于文件,正如我所说的,它是关于解析数据的,所以实际上要存储数据结构 - 即IList 。但这并不重要。 – queen3 2009-11-15 20:30:00

相关问题