1

我创建了新闻网站MVC。我有搜索功能。

Index ActionofSearch Controller被调用时,它从 获取记录database,它返回Search View. This Search View has AJAX Pagerfor paging,当点击 Pager 的 Next 或 Previous 按钮时,向ofAJAX发出请求。Paging ActionSearch Controller

现在我不想再打电话给我的Database. 我想使用在 of 期间获取Index action的结果Search Controller

现在我已经使用了Session[""]对象。

我想知道在这种情况下什么更适合用于状态管理。

从数据库中获取的结果可能在 1000-5000 左右ArticleName,,ArticleShortDescription(约 200 个字符)

4

3 回答 3

2

ViewBagViewData仅在当前请求中持久存在。因此,它们不可用。 TempData持续到下一个请求,但这可能是任何事情,所以不能保证它持续足够长的时间让您进行 Ajax 调用(或后续的 ajax 调用)。

实际上,Session在这种情况下,这是您唯一不错的选择,尽管它仍然不是最佳选择。您将存储大量信息,客户甚至可能不会请求这些信息。即便如此,在不再需要它之后清理它也可能很困难。

您最好的选择是调用考虑分页的数据库,因此您只返回每个请求的数据子集,而不仅仅是提取所有数据。

于 2014-10-09T08:29:08.773 回答
2

你不应该使用其中任何一个。会话是为每个用户创建的,如果您使用搜索为每个用户存储 1000 - 5000 篇文章,那么您将度过一段糟糕的时光。ViewData 从根本上说是具有良好包装器的 Session 对象,因此它对您的用例也不利。

假设您决定改用 HttpRuntime.Cache,这样您就不会将所有结果放在每个用户的基础上,那么您必须担心将对象存储在缓存中多长时间。

合乎逻辑的方法是使用分页查询数据库

为了防止频繁访问数据库,您应该使用搜索词 + 页码 + 页面大小(可选)作为缓存键来缓存分页结果,并将结果对象存储为缓存值,最好设置缓存过期时间。(在缓存被驱逐之前,您不希望提供陈旧的搜索结果,对吧?)

于 2014-10-09T08:37:01.087 回答
1

我避免使用会话状态,因为它会影响您的应用程序在负载平衡环境中的扩展方式。您必须确保用户始终拥有来自同一台服务器的请求,因为这是存储会话状态的地方(除非您将其放入数据库中,但这会破坏您的情况)。

我会尝试使用应用程序缓存。这确实意味着,如果用户单击 Next 或 Prev 并且该请求是从另一台服务器提供的,您将不得不再次访问数据库 - 但我个人更愿意接受这个打击。

看看这个页面,特别是向下滚动到应用程序缓存部分。

希望这可以帮助。

于 2014-10-09T08:32:22.390 回答