2016-11-07 4 views
0

У меня есть предыдущая/следующая настройка в работе, и следующая функциональность работает нормально (хотя это было создано кем-то еще некоторое время назад). Что касается предыдущей кнопки, это дает мне несколько проблем.Получить предыдущий элемент в списке

Вот код до сих пор:

private Item getPrevious() 
    { 
     Item CurrentItem = Sitecore.Context.Item; 
     var blogHomeID = "{751B0E3D-26C2-489A-8B8C-8D40E086A970}"; 
     Item BlogItem =db.Items.GetItem(blogHomeID); 
     Item[] EntryList= BlogItem.Axes.SelectItems("descendant::*[@@templatename='BlogEntry']"); 

     Item prevEntry = null; 

     for (int i = 0; i < EntryList.Length; i++) 
     { 
      if (EntryList[i] == CurrentItem) 
      { 
       return prevEntry; 
      } 

      prevEntry = EntryList[i]; 
     } 
    } 

Я понимаю, что вам нужно вычесть 1 из текущего элемента в списке, чтобы получить предыдущий, но до сих пор, все это, кажется, делает это отобразить точно такая же запись для предыдущей кнопки. Это всегда последняя запись в списке, а не предыдущая. Я чувствую, что это не должно быть так сложно, но это может быть старый код, с которым я пытаюсь работать. Не уверен.

ответ

5

Вы можете использовать GetPreviousSibling() и GetNextSibling() методы:

Sitecore.Context.Item.Axes.GetPreviousSibling() 

Sitecore.Context.Item.Axes.GetNextSibling() 

Это возвращает предыдущий и следующий родственный, или нулевое значение, если текущий элемент является первым/последним, соответственно.

Если вы хотите ограничить поиск по типу шаблона, то вы можете использовать preceding и following XPATH запросы:

Item previous = Sitecore.Context.Item.Axes.SelectItems("./preceding::*[@@templateid='{template-guid}']").LastOrDefault(); 

Item next = Sitecore.Context.Item.Axes.SelectSingleItem("./following::*[@@templateid='{template-guid}']"); 

Обратите внимание на использование SelectItems и LastOrDefault() на первом запросе. Оба запроса дают вам список элементов, отсортированных по заказу.

+0

Большое вам спасибо! Кажется, это трюк. –

0

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

Item prevEntry = null; 
for (int i = 0; i < EntryList.Length; i++) 
{   
    if (EntryList[i] == CurrentItem) 
    { 
     return prevEntry; 
    }   

    prevEntry = EntryList[i]; 
} 
+1

Кажется, это ничего не изменило. Сложно остановить список в определенной точке, но я пробовал этот код и не менял результатов. Должен ли быть элемент EntryList [i-1] в какой-то момент? –

+0

, что может означать, что EntryList не содержит CurrentItem –

+0

Я обновил свой код, чтобы все записи были получены для цикла EntryList, включая текущий. Однако никаких изменений в результатах не произошло. –

Смежные вопросы