2011-02-25 67 views
3

因此,对于如何在多个页面之间传递数据的问题似乎没有任何明确的答案。在完成了一些小作业之后,为什么(或者至少我已经搜集到):ASP.NET在多个页面之间传递数据会话

  1. ViewState变量不会在页面之间持续存在。
  2. 会话变量是不稳定的,必须谨慎使用。
  3. Cookie存在潜在的安全问题,需要时间并且必须保持较小。
  4. 在URL中存储变量对数据量有限制并且可能不安全。
  5. 存储瓦尔暂时在DB是一个真正的皮塔因为每次你可能可以传递到另一个页面对象添加一个表。

    到目前为止,这是寻找像我将使用隐藏域的keyid的和唯一的ID传递到下一个页面,然后检索数据库中的数据。你对这一切有什么想法?什么是最好的方式去做任何它?我很早就开发这个应用程序,所以现在做出改变是首选。

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

回答

1

会话变量应该适合您的需求。

我会去与StateServer或SQLServer会话状态模式。使用InProc模式是最快的,但它有一些问题(包括所有用户会话在推送新的二进制文件时被丢弃,web.config发生变化等)。会话波动很大,但您可以通过多种方式控制波动率。会话需要cookie,除非它们被配置为无cookie(我强烈建议您远离),但我认为这是一个合理的要求。

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

任何方法都有优点和缺点,全部是关于寻找最佳方法的方法。我希望这有帮助。

3

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

如果您在处理复杂的多部的形式,那么你就可以实现单页的形式,简单地显示或隐藏相关元素。尽可能多地使用用户控件和自定义控件以促进隔离和可重用性。这使得全面的生活变得更容易。

凡是是用户生成的是几乎肯定会在数据库中上而已 - 所以#5似乎并不相关。那就是你不应该将数据“暂时”存储在数据库中 - 哪些数据需要在不属于你的应用程序的页面之间保存。

其他任何东西似乎是会话相关的,并没有那么多的数据。

,如果我知道具体是什么你处理我可以添加一些更多的心思。

噢 - “Cookie存在潜在的安全问题并需要时间” - 除非您不想识别回访者,否则您将使用Cookie。任何潜在的安全问题只会是糟糕实施的结果,并且肯定会在隐藏领域传递数据并不会更好。你真的不想编写一个ASP.NET应用程序,这个应用程序是围绕发布到其他表单以外的页面设计的。由于许多原因,这只是一个令人头痛的问题,我不能想到将其作为基本应用程序设计的一部分来实现这一目标的好处。

+0

+1。这种类型的事情不能真正在上下文之外进行评估。另外你的其他观点正确。 – NotMe 2011-02-25 18:18:19

5

如果你想保持状态,是的,因为你不必担心过期。 Session是相似的,除非您必须担心Session到期。在这两种情况下,将相似数据写入同一区域的并发呼叫都可能导致问题并需要进行核算。

Session很好,当你不必担心多个Web服务器或超时问题。数据库为您提供了更多的可伸缩性,但是需要花费大量的数据库读/写操作,并且您必须考虑清理。

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

  1. 简单,简短而不是私人数据 - >查询字符串
  2. 是数据不太简单,但只需要很短的存在
  3. 将需要>会议
  4. 数据跨多个区域,对长时间内持续 - - 时间>数据库

当然,还有更多的是,这却应该GI由于您刚刚开始,所以请您提供一些基本的注意事项。把事情简单化。如果简单的查询字符串就足够了,不要试图过度设计解决方案。只要你保持简单就可以开始,你总是可以延迟工程。

+1

+1 - 我喜欢你的基本决策树,很好的方法来解决它。我只会添加查询字符串应该只是用于“获取”。也就是说,在目标页面加载时,不要使用查询字符串中的任何内容来确定数据库更新操作。搜索引擎,书签,不涉及正确条件的代码,都会导致你的问题。 – 2011-02-25 18:28:12

0

所有的方法都有其优点和缺点。这一切都取决于你正在工作的场景。

如果在合理范围内使用,会话变量的工作情况会非常好。交通繁忙网站中的InProc会话可能会迅速耗尽您的资源,但您始终可以切换到基于SQL Server的会话,以便大部分数据库为您工作。

+0

我期待在任何时间使用本网站的大量用户。 @凯尔西提到了数据库读/写带来的问题,这就是我现在所处的位置。每次我想传递数据时,读/写似乎都很成问题,然后再以某种方式清理。基于Sql Server的Session是否为我做这件事?我将如何设置? – 2011-02-25 18:24:21

+0

创建一个数据库表,该表将存储每个用户需要的任何数据。创建一个模型化该表的结构体或可序列化的类。当有人登录时,从数据库加载他们的记录,填充结构或对象,并将其存储在会话变量中。如果他们的数据在登录时更改,请更新相应的数据库行。我建议使用可序列化的类,以便可以定义进行数据库调用的方法(例如,加载用户,更新用户等)。 – 2011-02-25 18:31:14

+0

仍然不确定你在这里挣扎着什么。您需要在基本会话/授权信息之外的任何常规页面之间传递哪些数据?另外,在考虑建筑是好事的时候,不要过时。先写好代码。稍后优化。如果/出现性能问题时,很容易换掉存储数据的机制(假设您遵循DRY原则)。数据库速度非常快,硬件也比程序员时间便宜。 – 2011-02-25 18:32:18