Настройка рендеринга списка для разбиения на страницы

Я пытаюсь реализовать бесконечную прокрутку в Orchard, внося минимальные изменения.

Сценарий, который я использую, должен идеально идентифицировать с помощью селектора jquery ссылку на следующую страницу пейджера.

В настоящее время стандартный пейджер сада выглядит следующим образом:

<li><a href="/OrchardLocal/ricette?page=2">&gt;</a></li>

желаемый рендеринг:

<li class="next"><a href="/OrchardLocal/ricette?page=2">&gt;</a></li>

Я пробовал много способов переопределить шаблон Pager_Next, но безуспешно. Пейджер представляет собой список, а список создается кодом. Нет простого способа переопределить.

Отличная статья, в которой должно быть объяснено, как пропустить какую-то основную часть (например, переопределить весь список): http://weblogs.asp.net/bleroy/overriding-the-pager-rendering-in-orchard

Прямо сейчас мой обходной путь состоял в том, чтобы изменить исходный файл Orchard CoreShapes.cs для рендеринга списка, добавив эти две строки:

if (itemTag != null) {
  if (index == 0)
    itemTag.AddCssClass("first");
  if (index == count - 1)
    itemTag.AddCssClass("last");

  //new lines
  if (index == 1 && count > 2)
    itemTag.AddCssClass("previous");
  if (index == count - 2 && count > 2)
     itemTag.AddCssClass("next");

Пока работает, НО мне не нравится

1) Он меняет источник фруктового сада, это плохо

2) Меняет все списки (а не только пейджер)

Итак, «Как я могу переопределить список ТОЛЬКО для моей темы и ТОЛЬКО для пейджера таким образом, чтобы класс автоматически добавлялся в тег Page_Next li?»

Спасибо


person manudea    schedule 17.07.2014    source источник
comment
Использовать jQuery, чтобы добавить эти классы в нужные списки?   -  person Hazza    schedule 17.07.2014


Ответы (2)


Попробуйте что-то подобное в альтернативном представлении Pager.Next.cshtml:

@using System.Web.Routing;
@{
    string text = Model.Value.ToString();
    string action = Model.RouteValues["action"].ToString();
    RouteValueDictionary routeValues = (RouteValueDictionary)Model.RouteValues;
}

<span><a class="next" href="@Url.Action(action, routeValues)">@text</a></span>
person joshb    schedule 17.07.2014
comment
Абсолютно идеально. Я только что удалил диапазон ... на самом деле мне это не нужно :) Что мне действительно нужно, так это способ получить реальную ссылку, и вы предоставите мне идеальное решение. Спасибо. - person manudea; 18.07.2014

Я не уверен, что ответ Джошба достаточно близок для ваших нужд. Иначе я бы сказал почти то же самое.

Измените Pager.Next.cshtml и Pager.Previous.cshtml в своей теме и просто добавьте способ идентификации ссылки.

Используйте jQuery, чтобы добавить класс, который вам нужен, к родителю.

Это ни в коем случае не элегантное решение, но оно выполнит то, о чем вы просите, не меняя ядра и не затрагивая другие списки.

Мой тест выглядит так, просто для тестирования и только для следующего, но вы поняли идею.

(Очевидно, не используйте id, так как это даст вам повторяющиеся идентификаторы, это просто быстрый и грязный пример)

Pager.Next.cshtml :

@{
    var RouteValues = (object)Model.RouteValues;
    RouteValueDictionary rvd;
    if (RouteValues == null) {
        rvd = new RouteValueDictionary();
    }
    else {
        rvd = RouteValues is RouteValueDictionary ? (RouteValueDictionary)RouteValues : new RouteValueDictionary(RouteValues);
    }
}
<a id="pagination-pager-next" href="@Url.Action((string)rvd["action"], rvd)"><i class="fa fa-angle-right"></i></a>

И добавил это в конец Pager.cshtml, но у вас может быть лучшее место для этого:

<script>
    $(document).ready(function () {
        $("#pagination-pager-next").parent().addClass("next");
    });
</script>
person Søren Ullidtz    schedule 17.07.2014
comment
Спасибо. Я сделал ответ Джошба принятым только потому, что он был первым. Использование jquery приятно, но добавляет дополнительный уровень сложности, который мне не нужен в этом контексте. В любом случае наличие класса в теге a сделало свое дело. Всего наилучшего. - person manudea; 18.07.2014