临时存储表单数据的两种选择是,首先,将每个表单的信息存储在会话状态变量中,其次,使用 URL 参数传递表单信息。使用 Cookie 作为潜在的第三种选择根本不可行,原因很简单,您的许多访问者可能会关闭 cookie(但这不会影响会话 cookie)。另外,根据您的问题的性质,我假设您不希望在完全提交之前将此信息存储在数据库表中。
使用会话变量是这个问题的经典解决方案,但它确实存在一些缺点。其中包括 (1) 如果您使用 inproc 会话管理,大量数据可能会耗尽服务器 RAM,(2) 在服务器场中的多个服务器之间共享会话变量需要额外考虑,以及 (3) 专业设计的应用程序必须防止会话过期(不要只转换会话变量并使用它 - 如果会话已过期,则转换将引发错误)。然而,对于绝大多数应用程序来说,会话变量无疑是要走的路。
另一种方法是在 URL 中传递每个表单的信息。这种方法的主要问题是您必须非常小心地“传递”信息。例如,如果您在四个页面中收集信息,则需要在第一个页面中收集信息,将其在 URL 中传递到第二个页面,您必须将其存储在该页面的视图状态中。然后,当调用第三个页面时,您将从第二个页面收集表单数据以及视图状态变量,并在 URL 等中进行编码。如果您有五个或更多页面,或者如果访问者将在站点周围跳转,您你手上会一团糟。还要记住,所有信息都需要 A) 序列化为 URL 安全字符串 B) 以防止简单的基于 URL 的黑客攻击的方式编码(例如 如果您将价格以明文形式传递并传递,有人可能会更改价格)。请注意,您可以通过创建一种“会话管理器”并让它为您管理 URL 字符串来减少其中一些问题,但是您仍然必须对任何给定链接可能会破坏某人的整个会话的可能性非常敏感,如果它没有得到妥善管理。
最后,我只使用 URL 变量将非常有限的数据从一个页面传递到下一个页面(例如,在指向该项目的链接中编码的项目 ID)。
那么,让我们假设您确实会使用内置的会话功能来管理用户的数据。为什么有人会告诉你“会话是邪恶的”?好吧,除了上面提到的内存负载、服务器群和过期注意事项之外,对 Session 变量的主要批评是它们实际上是无类型变量。
幸运的是,谨慎使用 Session 变量可以避免内存问题(大项目无论如何都应该保存在数据库中),如果您运行的站点大到需要一个服务器场,那么有很多机制可用于共享 ASP 内置的状态.NET(提示:您不会使用 inproc 存储)。
为了从本质上避免 Session 的所有其他缺点,我建议实现一个对象来保存您的会话数据以及一些简单的 Session 对象管理功能。然后将它们构建到 Page 类的后代中,并将这个后代 Page 类用于所有页面。然后,通过页面类作为一组强类型值访问您的 Session 数据是一件简单的事情。请注意,您的对象字段将为您提供一种以强类型方式访问每个“会话变量”的方法(例如,每个变量一个字段)。
如果这对您来说是一项简单的任务,或者您是否想要一些示例代码,请告诉我!