ASP.NET MVC在Controller中存储临时数据

时间:2016-03-22 11:02:02

标签: asp.net-mvc

可能这是一个简单的问题,但经过一段时间的研究后,我仍然比开始时更困惑,因为我觉得我的情况非常特别。首先说,我是MVC的新人,所以,我还在学习.net mvc架构。

我会告诉你我的用例。

我有一个页面,用户可以执行产品搜索,可能有大约10到15个过滤器。一个查询可能需要不到一秒或超过10秒,所有这些都取决于过滤器的复杂性。搜索在具有超过500万条记录的数据库中执行。

搜索完成后,用户可以选择按多个属性排序,搜索特定字符串等。所以,想象一下,我的上次搜索需要10秒钟,对数据库进行查询始终是一个好主意,用户想要重新排序产品列表。

目前,我正在使用Session范围来存储从数据库返回的结果的IEnumerable。然后,如果我想对返回的数据执行一些过滤之王,我会在该列表上工作。这真的很快,做我想做的事。

但我有一些良知问题。会话上下文在我看来并不适合临时存储这种信息。主要原因是当我在特定的页面(控制器)时,我只想访问该信息。如果我退出该页面,我的目标是删除信息。

我的问题是关于此,会话上下文是执行此操作的最佳位置?以及如何保证当我退出该控制器时,信息被删除。

希望我澄清。

2 个答案:

答案 0 :(得分:1)

最终,Session.Context似乎不是存储此类信息的合法位置。

在我的项目中,我通常在每个用户过滤器上查询信息,虽然我们的数据库相当少,查询执行速度非常快,我们使用AJAX调用来改善用户体验。

在您的环境中,我会选择以下两种方法之一:

1)如果数据结果集很容易适合您的模型类,并且通常由几个元素组成:

然后,您可以尝试将结果集传递回管理筛选搜索的控制器。允许您的业务类过滤先前的数据集或查询数据库(如果它没有以前的结果集)。

2)结果集的数据结构很复杂,并且模型绑定器不能直接将其加载回控制器,或者只是结果集有很多结果,所以从客户端到服务器来回传递这么多结果似乎是一个坏主意:

在这种情况下,我可能会选择使用javascript的客户端解决方案。当任何用户对数据库进行查询或者只是重新构造以前的查询时,我会有所不同。在第一种情况下,我将调用一个返回结果集的控制器,在第二种情况下,我将在客户端代码上创建一个过滤引擎。

要将结果集转换为可以通过javascript轻松管理的数据结构,请使用JSON。

答案 1 :(得分:1)

首先,500万条记录并不是什么大不了的事。

  1. 从查询概要分析开始,您需要添加一些索引,您可以将查询加载到Sql Management studio并对其进行概要分析,甚至更多短信也会建议您编制索引。
  2. 存储缓存的位置总是取决于。有很多方法可以做到这一点。首先,您可以编写自己的cache provider并将序列化对象存储在数据库中,然后您可以通过特定密钥(可以是sesssion id,用户ID),反序列化和处理数据来获取它。不利的一面是,如果你将大量数据加载到内存中,它将无助于减慢系统速度
  3. 在.net中有classes用于缓存
  4. 您可以使用redismemcached
  5. 缓存真的取决于你的设置,你的查询,但我会从优化SQL查询开始,并确保他们使用索引