【问题标题】:mvc jquery paging search results with only 1 querymvc jquery 分页搜索结果只有 1 个查询
【发布时间】:2010-11-13 12:08:09
【问题描述】:

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

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

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

提前感谢您的任何建议。

编辑:弗朗西斯科的建议正是我所需要的。我通过一些小改动实现了它,并创建了一些 jquery 按钮来导航到第一页/上一页/下一页/最后一页以及“查看 N-m 中的 N 个结果”标签。谢谢大家的建议。

【问题讨论】:

  • 添加了另一个想法供您考虑!

标签: jquery asp.net-mvc pagination


【解决方案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);
}

【讨论】:

  • 我考虑过,但我将如何动态地做到这一点?我不知道会有多少页。我可以很容易地生成包含序列号的 div id,但是如何使用 javascript 中的页码变量访问这些元素?
  • 谢谢@Francisco!我想这就是我想做的。让我试一试,然后回复你。
【解决方案2】:

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

当用户页面时,你只需调整你的偏移量。诸如查询缓存和优化之类的东西是内置的。几周前我下载并编译了一个 POC 来构建索引,从索引中添加和删除项目,并通过将样本拼凑在一起在几分钟内返回结果。我更喜欢使用专用索引进行索引,让数据库更多地用作专用存储介质 - 但这是我个人的偏好。

如果您决定查看它,请从他们的 SVN 中提取并编译源代码。 “稳定”版本有点过时了。

编辑:

这是一个使用 Lucene.NET 进行分页的简短示例:Paging using Lucene.net

【讨论】:

  • 没听说过,但会检查一下。不过,我通常希望在不添加额外技术的情况下做到这一点,而且我认为这应该已经可以使用 ASP.NET、MVC、LINQ to SQL 和 jquery 来实现——所有这些我都已经在使用了。
  • 明白。这绝对是可能的,它只是归结为确定系统上的预期负载并认识到这可能成为稍后重新审视的一个问题。根据记录的数量和并发用户的数量,像 Lucene.NET 这样的东西可能有点矫枉过正。
【解决方案3】:

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

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

你需要先做一些分析。

需要考虑的因素:

  • 用户可能会获得多少结果 浏览?

  • 用户可以在一页上处理这么多信息吗?

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

更新

另一个选项可能是使用无限滚动。基本上,当用户滚动结果并接近屏幕末尾时,您会自动加载 x 更多结果。更多herehere

【讨论】:

  • 感谢您的浏览。我正在考虑缓存,但我不知道该怎么做。用户通常会看到 50-100 个结果,我计划制作每页 5 个结果的页面。总结果太大而不能放在一页上——每个“结果”实际上只有几行,而且太多了。一个页面上即使有 10 个结果也意味着用户必须进行大量滚动。虽然结果很长,但实际上并没有那么多数据(每个结果约 200 字节)。内容有一些问题(我不会深入探讨),这意味着它必须占据相当大的屏幕区域。
  • 另一个想法,添加到答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多