我有一个搜索页面,我将其作为ASP.NET + MVC + jquery站点的一部分实现。搜索查询对作为结果集的一部分返回的每个结果进行评分。即更接近比赛的得分越高。
因为结果集可以更改,并且因为对匹配进行评分的算法有点密集,所以我只想加载一次结果并找到点击结果页面的方法。
我想我会创建一个包含所有搜索结果的页面(每个结果都有自己的结果),然后通过单击与jquery代码关联的按钮来显示/隐藏子集。我想我可以在开始尝试使它工作之前看到如何做到这一点(我仍然是jquery的新手),但我想我会先看看是否有人有更好的想法。< / p>
提前感谢任何建议。
编辑:弗朗西斯科的建议正是我所需要的。我实现了一些微小的更改,并创建了一些jquery按钮,以导航到第一页/上一页/下一页/最后一页以及“查看结果n-m out of N”标签。感谢您的所有建议。
答案 0 :(得分:1)
通过缓存的结果集缓存结果和页面。也许使用jqGrid和json的组合。
但是,您并没有为我们提供足够的信息来提供最佳方法。
您需要先进行一些分析。
要考虑的因素:
用户可能有多少结果 看透?
用户可以在一个页面上处理如此多的信息吗?
如果渲染整个结果集,页面会变慢吗?
<强>更新强>
另一种选择可能是使用Infinite Scroll。基本上,当用户滚动结果并朝向屏幕的末尾时,您会自动加载x更多结果。更多here和here
答案 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);
}