在这种情况下更好的是什么? ViewBag或TempData或Session?

时间:2014-10-09 08:22:20

标签: ajax asp.net-mvc state-management

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

当调用Index Action的{​​{1}} Search时,它会从Controller获取记录,然后返回database 此搜索视图有Search View.用于分页,当点击寻呼机的下一个或上一个按钮时,AJAX Pager请求AJAX Paging Action

现在我不想再打电话给Search Controller了。我想使用Database Index action期间提取的结果。

现在我使用了Search Controller个对象。

我想知道在这种情况下用于状态管理的更好方法。

从数据库中提取的结果大约为1000-5000,Session[""]ArticleName(约200个字符)

3 个答案:

答案 0 :(得分:2)

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

实际上,Session是你在这种情况下唯一不错的选择,尽管它仍然不是最佳选择。 您将存储批次信息,甚至可能不被客户请求。即使这样,在不再需要它之后进行清理也可能很难。

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

答案 1 :(得分:2)

你不应该使用任何这些。会话是按用户创建的,如果您使用搜索为每个用户存储1000-5000篇文章,那么您将遇到不好的时间。 ViewData基本上是一个包含很好包装器的Session对象,所以它对你的用例也不好。

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

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

为了防止频繁访问您的数据库,您应该将分页结果与搜索词+页码+页面大小(可选)一起缓存为缓存键,并将结果对象存储为缓存值,理想情况是缓存过期组。 (你不想提供陈旧的搜索结果,直到你的缓存被驱逐出去?)

答案 2 :(得分:1)

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

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

查看this page,特别是向下滚动到应用程序缓存部分。

希望这有帮助。