ASP.NET在多个页面会话之间传递数据

时间:2011-02-25 17:55:50

标签: asp.net

因此,对于如何在多个页面之间传递数据的问题,似乎没有任何可靠的答案。在完成一些功课之后,这就是为什么(或者至少我收集到的内容):

  1. ViewState变量不会跨页面保留。
  2. 会话变量是易变的,必须谨慎使用。
  3. Cookie存在潜在的安全问题,需要时间并且必须保持较小。
  4. 在网址中存储变量对数据量有限制,可能不安全。
  5. 暂时在虚拟机中存储变量是一个真正的皮塔,因为每个对象可能会添加一个可能传递给另一个页面的表。

    到目前为止,看起来我将使用隐藏字段将keyid和唯一ID传递给下一页,然后从db中检索数据。你对这一切有什么看法?做任何一件事的最佳方法是什么?我很早就开发了这个应用程序,所以现在更改。

  6. 编辑:我期待很多用户在任何时候使用此应用程序,这是否会影响我是否应该使用基于SQL Server的会话?

4 个答案:

答案 0 :(得分:5)

如果要保持状态,请将其存储在数据库中,因为您不必担心过期。 Session类似,但您必须担心Session到期。在这两种情况下,将相似数据写入同一区域的并发调用可能会导致问题,需要加以考虑。

当您不必担心多个Web服务器或超时问题时,

Session很好。数据库为您提供了更多的可伸缩性,但代价是执行大量的数据库读/写操作,您必须考虑清理。

我个人会尝试使用以下决策树:

  1. 数据简单,简短而非私密 - >查询字符串
  2. 数据不那么简单,但只需要在短时间内存在 - >会话
  3. 是否需要跨越多个区域的数据并且长时间持续 - >数据库
  4. 当然还有更多内容,但是这应该会给你一个基本的考虑因素,因为你刚刚开始。把事情简单化。如果简单的查询字符串就足够了,请不要尝试过度设计解决方案。只要你保持简单的开始,你总是可以过度工程。

答案 1 :(得分:3)

我认为上下文在这里很重要,例如你想在页面之间传递什么?为什么?

如果您正在处理复杂的多部分表单,那么您可以在单个页面中实现表单,只显示或隐藏相关元素。尽可能使用usercontrols和自定义控件以促进隔离和可重用性。这使得生活变得更加容易。

用户生成的任何东西几乎肯定会最终在数据库中结束 - 所以#5似乎并不相关。也就是说,您不必将数据“临时”存储在数据库中 - 需要在不属于您的应用程序的页面之间保留哪些数据。

其他任何东西似乎与会话相关,而不是那么多数据。

如果我知道你在具体处理什么,我可以添加一些想法。

哦 - “cookies有潜在的安全问题,需要时间” - 你将使用cookies,除非你不想识别回访者。任何潜在的安全问题都只是执行不良的结果,当然在隐藏字段中传递数据也不是更好。而且你真的不想编写一个围绕发布到自身以外的表单的页面设计的ASP.NET应用程序。这只是令人头疼的原因很多,我不能想到这样做的好处是基本应用程序设计的一部分。

答案 2 :(得分:1)

会话变量应该可以满足您的需求。

我会选择StateServer或SQLServer Session状态模式。使用模式InProc是最快的,但它有一些问题(包括推送新二进制文件时所有用户会话被删除,web.config更改等)。会话不稳定,但您可以通过多种方式控制波动性。会话需要cookie,除非它们被配置为无cookie(我强烈建议你远离),但我认为这是一个合理的要求。

此外,您可以创建一个struct或serializable类,您可以从中创建可以存储在会话变量中的对象。结构或类将允许您将所有数据保存在一个位置 - 您只需担心一个会话变量。

任何方法都有优点和缺点,所有这些都是关于找到最佳方法。我希望这会有所帮助。

答案 3 :(得分:0)

所有方法都有其优点和缺点。这完全取决于您正在进行的工作。

如果在合理范围内使用,会话变量可以很好地工作。流量较大的站点中的InProc会话可以快速耗尽您的资源,但您始终可以切换到基于SQL Server的会话,该会话可以为您完成大部分数据库工作。