Учебник по использованию Loop Helper для WebMatrix - PullRequest
1 голос
/ 11 мая 2011

Я только что узнал о пакете Nuget Loop Helper для WebMatrix . К сожалению, я не могу найти какую-либо документацию или сайт проекта. У кого-нибудь есть какая-либо информация о том, как использовать это или где находится сайт проекта?

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Отслеживание OuterLoop не совсем сложно. Помощник сохраняет свое состояние в Context.Items, что обеспечивает изоляцию на уровне запросов. Каждый раз, когда отслеживается новый цикл, он проверяет, присутствует ли уже значение в Context.Items, и назначает его новому циклу в качестве свойства OuterLoop. Когда перечислитель удаляется, значение в Context.Items устанавливается равным OuterLoop, эффективно выталкивающим текущий цикл.

foo.Track()
   fooWrapper.OuterLoop = Content.Items["Loop"] // null at this point.
   Context.Items["Loop"] = fooWrapper

bar.Track()
   barWrapper.OuterLoop = Content.Items["Loop"] // fooWrapper
   Context.Items["Loop"] = barWrapper

bar.Dispose()
   Context.Items["Loop"] = barWrapper.OuterLoop // Current in fooWraper

Это означает, что вы могли бы иметь любую глубину циклов, включая те, которые охватывают страницы, и это все равно будет работать.

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

1 голос
/ 12 мая 2011

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

Все, что Loop.OuterLoop делает, ссылается на родительский цикл, если вы находитесь в нем, и он отслеживается, например:

@{
  int[] outerThings = new int[] {1,2,3,4};
  var innerThings = new[] {"a","b","c", "d"};

  foreach (int outerThing in outerThings.Track())
  {
    <li>@outerThing

    @foreach(var innerThing in innerThings.Track())
    {
      <li>---->@innerThing

      @if (Loop.OuterLoop.First)
      {
        <strong>Start of outer loop (index is: @Loop.OuterLoop.Index)</strong>  
      }

      @if (Loop.OuterLoop.Last)
      {
        <strong>end of outer loop (index is: @Loop.OuterLoop.Index)</strong>  
      }
      </li>
    }
    </li>
  }
}

Под капотом помощник просто оборачивает доступ к вашим массивам, спискам и коллекциям и отслеживает движение вперед по этим элементам с возрастающим значением внутреннего индекса.

Обновление:

Вот пример использования трех вложенных циклов с внутренним циклом, ссылающимся на самый внешний цикл (outerThings):

@{
  int[] outerThings = new int[] {1,2,3,4};
  var middleThings = new[] { "A", "B", "C", "D" };
  var innerThings = new[] { "a", "b", "c", "d" };

  foreach (int outerThing in outerThings.Track())
  {
    <li>@outerThing

    @foreach(var middleThing in middleThings.Track())
    {
      <li>---->@middleThing

      @foreach(var innerThing in innerThings.Track())
      {
        <li>-----+---->@innerThing

        @if (Loop.OuterLoop.OuterLoop.First)
        {
          <strong>
            Start of outerThing loop (index is: @Loop.OuterLoop.OuterLoop.Index)
          </strong>  
        }

        @if (Loop.OuterLoop.OuterLoop.Last)
        {
          <strong>
            End of outerThing loop (index is: @Loop.OuterLoop.OuterLoop.Index)
          </strong>  
        }
        </li>
      }
      </li>
    }
    </li>
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...