这主要是理论上的问题,因为我实际上可以以任何方式实现它,但它让我困惑了一下。因此,假设我向用户提供一个页面来选择一个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 /文件实现,就像这样。
我同意,我会坚持数据到数据库并显示导入记录和错误的摘要屏幕。用另一个屏幕检索名称并让用户选择它作进一步处理,将内部数据保存在数据库中。 – Decker97 2009-11-15 20:06:33
推送可能兆字节的数据到页面有时是一个非常糟糕的主意。然后用户只关闭浏览器(或崩溃) - 数据会永远留在数据库中吗?是的,有办法跟踪它 - 我自己做 - 但是有没有常见的方法或库,以便一千个程序员不会每天都重复这个过程? – queen3 2009-11-15 20:21:52