使用asp.net MVC进行分页搜索结果

5
我有一个问题在这里的搜索中找不到解决方案。以下是情景:
我有一个搜索表单,其中有2个必填字段和多个可选字段。该表单发帖至动作方法,该方法确定选择了哪些字段并构建与搜索条件匹配的对象列表。然后我将该List<>传递给视图进行显示。
我遇到的问题涉及如何使用asp.net mvc进行分页。对于过去的项目,我使用自定义Html助手创建链接,其中包括查询参数以及“page”参数。然后使用GET请求和.Take().Skip()格式。
我在这个项目中遇到了一个难题,因为我不能使用GET请求获取搜索条件,也无法想出一种保持List<>在内存中以执行常规“page”参数技巧的方法。
我考虑将List<>存储在会话中,但对象和列表可能非常大。
我认为这是高级搜索表单中常见的问题,但似乎找不到好的解决方案。如有帮助,敬请告知。谢谢!

为什么不编写一个帮助程序或扩展来进行分页,并在视图中使用它?我只是随口说说..谢谢。 - Mahesh Velaga
3个回答

3
如何将搜索结果对象缓存并赋予其唯一键。然后,您的分页链接将引用该唯一键(SearchID),并且您的操作将查找该对象,从缓存中提取它并从那里跳过/获取。这样,每个请求都不需要重新构建对象,从而加快页面加载速度并减轻数据库/应用程序的负担。
以下是有关缓存的文章:

https://web.archive.org/web/20211020111559/https://aspnet.4guysfromrolla.com/articles/100902-1.aspx

这里是关于缓存的视频:

http://www.asp.net/learn/Videos/video-6206.aspx

注意:请确保在缓存对象上指定过期日期。

@AndreiMikhalevich,当您不想重新查询数据源时,有更好的方法吗? - Alexandra
1
@Alexandra,如果您不想重新查询数据源,显然您应该在某个地方保存您的搜索结果。这就是缓存的全部意义。您可以将其保存在会话、文件或应用程序存储中。存储到哪里由您决定。但是无论如何,您都应该将其存储起来。 - Andrei

2
如果我理解正确的话,您希望只加载一次搜索结果,然后进行分页浏览。
您是否尝试过使用jQuery分页功能?您可以将整个列表都倒出来,然后使用JavaScript来处理分页(如果您喜欢还可以排序)。
一个例子可以在http://beckelman.net/demos/jqueryTableSorterConPaging/default.aspx找到。

谢谢,这可能是我要走的方向。不过我很好奇,在没有 JavaScript 的情况下是否也有可能实现? - DM.
2
如果您不想使用JavaScript,您需要使用某种缓存(如另一个答案中所解释的),并将页面更改通知服务器。由于您想避免GET,因此可以将分页链接包装在表单中并进行POST,这将在原始搜索的缓存上运行.Take().Skip()。 - Jonathan Freeland

1
将所有内容放在同一个表单中:必填字段、可选字段和页面链接。
有两种可能性:
1. 使用提交按钮或图像代替锚标签,每个页面链接都有不同的名称(例如page1page2,...):这将允许您在提交表单时获取所需的页面。
2. 在表单中添加一个隐藏字段。然后为任何一个页面锚点添加一个JavaScript点击处理程序。此处理程序将使用页面更新隐藏字段的值,提交表单并取消事件。
因此,单击任何分页器链接都将提交表单,并提供构建列表和分页器链接所需的所有数据。

我把所有东西都放在同一个表单中。在我的操作方法中,我将所有可选参数设置为可空,并对必填字段进行了一些简单的验证。我还试图避免为每个页面重新提交整个逻辑,因为我使用的筛选对象的逻辑非常繁重。感谢您的回复! - DM.
1
问题是我需要能够浏览一个复杂对象列表,而不使用查询字符串,并且每次请求新页面时不需要重新构建列表。不确定是否可能实现。 - DM.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接