mvc jquery只有1个查询的分页搜索结果

时间:2009-07-23 18:33:24

标签: jquery asp.net-mvc pagination

我有一个搜索页面,我将其作为ASP.NET + MVC + jquery站点的一部分实现。搜索查询对作为结果集的一部分返回的每个结果进行评分。即更接近比赛的得分越高。

因为结果集可以更改,并且因为对匹配进行评分的算法有点密集,所以我只想加载一次结果并找到点击结果页面的方法。

我想我会创建一个包含所有搜索结果的页面(每个结果都有自己的结果),然后通过单击与jquery代码关联的按钮来显示/隐藏子集。我我可以在开始尝试使它工作之前看到如何做到这一点(我仍然是jquery的新手),但我想我会先看看是否有人有更好的想法。< / p>

提前感谢任何建议。

编辑:弗朗西斯科的建议正是我所需要的。我实现了一些微小的更改,并创建了一些jquery按钮,以导航到第一页/上一页/下一页/最后一页以及“查看结果n-m out of N”标签。感谢您的所有建议。

3 个答案:

答案 0 :(得分:1)

通过缓存的结果集缓存结果和页面。也许使用jqGrid和json的组合。

但是,您并没有为我们提供足够的信息来提供最佳方法。

您需要先进行一些分析。

要考虑的因素:

  • 用户可能有多少结果 看透?

  • 用户可以在一个页面上处理如此多的信息吗?

  • 如果渲染整个结果集,页面会变慢吗?

<强>更新

另一种选择可能是使用Infinite Scroll。基本上,当用户滚动结果并朝向屏幕的末尾时,您会自动加载x更多结果。更多herehere

答案 1 :(得分:1)

您是否考虑过使用Lucene.NET之类的内容进行索引? Lucene.NET在处理寻呼偏移方面做得非常好。您从搜索中返回的Document实例可以包含各个记录的键值,也可以存储足够的信息来表示每个项目的每个搜索结果的可视方面。

当用户页面时,您只需调整偏移量即可。内置了查询缓存和优化等功能。几周前我拆了并编译了一段POC来构建索引,添加和删除索引中的项目,并在几分钟内将样本拼凑在一起返回结果。我更喜欢使用专用索引进行索引,使数据库更像是一种专用存储介质 - 但这是我个人的偏好。

如果您决定将其签出,请从SVN中提取并编译源代码。 “稳定”版本有点过时了。

修改

以下是使用Lucene.NET进行分页的简短示例:Paging using Lucene.net

答案 2 :(得分:1)

我认为你的想法已经足够好了。

只需将每页所需的所有元素放入不同的div中。然后给div一个容易识别的class或id属性,例如:

<div id="page1" class="divpage">
page 1 html here
</div>
<div id="page2" class="divpage">
page 2 html here
</div>

jQuery代码如下所示:

$("#page1").show();
$(".divpage").hide(); //this hides all other divs

修改

要动态执行此操作,请创建与结果列表关联的强类型视图。视图的标题应该是:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<Result>>" %>

“结果”是你的班级:

public class Result
{
    int score {get;set;}
    string data {get;set;}
}

然后在你看来,你把它放在:

<%int resultsPerPage = 10;
int currentResults = 0;
int numPage=0;

foreach(var item in Model) 
{   
    if (currentResults==0) Response.Write("<div id=\"page"+numPage+"\" class=\"divpage\">");
    %>

    <%=item.score.ToString()%>
    <%=item.data%>

    <%currentResults++;
    if (currentResults>resultsPerPage)
    {
        numPage++;
        currentResults=0;
        Response.Write("</div>");
    }
}%>

<%if (currentResults!=0) Response.Write("</div>");%>

然后是你的按钮:

<%for (int i=0;i<numPage;i++)
{
%>
<a href="" onclick="showPage('<%=i%>');return false;">Page <%=i%></a>

<%}%>

<script type="text/javascript">

function showPage(num)
{
    $("#page"+num).show();
    $(".divpage").hide();
}

</script>

最后,在您的控制器中:

public ActionResult ShowResults()
{
    List<Result> results = getResultsOrdererdByScoreFunction();
    return View(results);
}