2009-07-23 2 views
1

У меня есть страница поиска, которую я реализую как часть сайта ASP.NET + MVC + jquery. В поисковом запросе оценивается каждый результат, который возвращается как часть набора результатов. т. е. более высокий балл для более близкого совпадения.mvc jquery paging результаты поиска только с одним запросом

Поскольку набор результатов может измениться, и поскольку алгоритм, который оценивает совпадения, несколько интенсивный, я хочу только один раз загрузить результаты и найти способ щелчка по страницам результатов.

Я полагал, что создаю страницу, содержащую все результаты поиска (каждый результат имеет свой собственный) и просто покажет/скроет подмножество, нажав на кнопки, связанные с кодом jquery. I думаю Я могу видеть, как это сделать, прежде чем я начну пытаться заставить его работать (я все еще довольно новичок в jquery), но подумал, что сначала посмотрю, есть ли у кого-нибудь лучшие идеи.

Заранее благодарим за любые предложения.

Редактировать: Предложение Франциско было именно тем, что мне было нужно. Я внедрил его с некоторыми незначительными изменениями и создал несколько кнопок jquery для перехода на первую/предыдущую/следующую/последнюю страницу вместе с меткой «Просмотр результатов n-m из N». Спасибо за все предложения.

+0

Добавлена ​​еще одна идея для вас! – redsquare

ответ

1

Я думаю, что ваша идея достаточно хороша.

Просто поместите все элементы, которые вы хотите, с каждой страницы в разные divs. Затем дать Div класс или идентификатор атрибута, которое легко идентифицировать, например:

<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 

Edit:

Чтобы сделать это динамически, создайте строго типизированное представление, связанное с вашим списком результатов. Заголовок точки зрения должно быть что-то вроде:

<%@ 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); 
} 
+0

Я подумал об этом, но как бы я сделал это динамически? Я заранее не знаю, сколько страниц будет. Я могу легко сгенерировать идентификаторы div, чтобы содержать последовательные числа, но как получить доступ к этим элементам, используя переменную для номера страницы в javascript? – user101306

+0

добавил код для этого – Francisco

+0

Спасибо @Francisco! Я думаю, что это то, что я хочу делать. Позвольте мне попробовать и вернуться к вам. – user101306

1

Кэш результатов и страницы с помощью кэшированного набора результатов. Возможно, используя комбинацию jqGrid и json.

Однако на самом деле вы не располагаете достаточной информацией для нас, чтобы дать лучший подход.

Сначала вам необходимо провести анализ.

Факторы, чтобы рассмотреть:

  • Сколько результатов является пользователь, скорее всего, полистать?

  • Может ли пользователь иметь дело с таким количеством информации на одной странице?

  • Будет ли страница медленной, если вы отрисуете весь набор результатов?

UPDATE

Другим вариантом может быть использование Infinite Scroll. В основном, когда пользователь прокручивает результаты и приближается к концу экрана, вы автоматически загружаете x больше результатов. Подробнее here и here

+0

Спасибо, что посмотрели. Я рассматриваю кеширование, но я не знаю, как это сделать. Пользователи обычно будут видеть 50-100 результатов, и я планировал сделать страницы с 5 результатами на страницу. Общие результаты слишком велики, чтобы нанести на одну страницу - каждый результат - это несколько строк, и их слишком много. Даже 10 результатов на странице означают, что пользователю придется много прокручивать. Хотя результаты длинные, на самом деле данных не так много (~ 200 байт за результат). Есть только что-то о содержании (которое я не буду вдаваться), что означает, что он должен занимать справедливую часть области экрана. – user101306

+0

Еще одна идея, добавленная к ответу – redsquare

1

Рассматривали ли вы использование чего-то вроде Lucene.NET для вашего индексирования? Lucene.NET отлично справляется со смещением для подкачки. В экземплярах Document, которые вы возвращаете из своего поиска, могут содержаться ключевые значения для отдельных записей или вы можете хранить достаточно информации для представления визуальных аспектов для каждого результата поиска для каждого элемента.

При использовании пользовательских страниц вы просто корректируете смещение. Встроенные функции кэширования запросов и оптимизации. Несколько недель назад я снял и скомпилировал и создал POC для создания индекса, добавления и удаления элементов из индекса и возвращения результатов всего за несколько минут, объединив образцы. Я предпочитаю использовать выделенный индекс для индексирования, оставляя базу данных больше работать как выделенный носитель данных, но это мои личные предпочтения.

Если вы решите проверить это, потяните и скомпилируйте источник из своего SVN. «Стабильная» версия немного устарела.

Edit:

Вот краткий пример на пейджинг с Lucene.Net: Paging using Lucene.net

+0

Не слышал об этом, но проверю. Обычно мне хотелось бы сделать это без добавления дополнительных технологий, и я полагаю, что это уже возможно, используя ASP.NET, MVC, LINQ to SQL и jquery - все это я уже использую. – user101306

+0

Понял. Это определенно возможно, дело сводится к определению того, что ожидаемая нагрузка будет в системе, и признавая, что это может стать точкой, которую нужно пересмотреть позже. В зависимости от количества записей и количества одновременных пользователей что-то вроде Lucene.NET может быть излишним. –