我在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个字符)
答案 0 :(得分:2)
ViewBag
或ViewData
仅在当前请求中持久存在。因此,它们不可用。
TempData
一直持续到下一个请求,但这可能是任何事情,所以不能保证它会持续足够长的时间来进行Ajax调用(或后续的ajax调用)。
实际上,Session
是你在这种情况下唯一不错的选择,尽管它仍然不是最佳选择。
您将存储批次信息,甚至可能不被客户请求。即使这样,在不再需要它之后进行清理也可能很难。
您最好的选择是调用数据库,将分页考虑在内,因此您只需返回每个请求的数据子集,而不是仅仅提取所有数据。< / p>
答案 1 :(得分:2)
你不应该使用任何这些。会话是按用户创建的,如果您使用搜索为每个用户存储1000-5000篇文章,那么您将遇到不好的时间。 ViewData基本上是一个包含很好包装器的Session对象,所以它对你的用例也不好。
让我们假设您决定使用HttpRuntime.Cache,这样您就不会在每个用户的基础上放置所有结果,那么您必须担心将对象存储在缓存中需要多长时间。
逻辑方法是使用分页查询数据库
为了防止频繁访问您的数据库,您应该将分页结果与搜索词+页码+页面大小(可选)一起缓存为缓存键,并将结果对象存储为缓存值,理想情况是缓存过期组。 (你不想提供陈旧的搜索结果,直到你的缓存被驱逐出去?)
答案 2 :(得分:1)
我避免使用会话状态,因为它会影响应用程序在负载平衡环境中的扩展方式。您必须确保用户始终具有来自同一服务器的请求,因为这是存储会话状态的位置(除非您将其放在数据库中,但这会使您的情况失败)。
我会尝试使用应用程序缓存。这意味着,如果用户单击Next或Prev并且该请求是从另一台服务器提供的,那么您将不得不再次访问该数据库 - 但我个人更愿意接受该命中。
查看this page,特别是向下滚动到应用程序缓存部分。
希望这有帮助。