2011-05-11 8 views
1

방금 ​​Nuget 패키지 Loop Helper for WebMatrix에 대해 배웠습니다. 불행히도 어떤 문서 또는 프로젝트 사이트도 찾을 수없는 것 같습니다. 누구나이 사이트를 사용하는 방법이나 프로젝트 사이트의 위치에 대한 정보가 있습니까?WebMatrix 용 루프 도우미 사용 자습서

+0

FWIW 내가 프로젝트에 추가 한 cshtml 파일을 보았지만'Loop.OuterLoop'에 대해서는 아무 것도 이야기하지 않았습니다 –

답변

1

제공된 샘플은 당신이 알아야 할 모든 것을 거의 다룰 것이라고 생각합니다. 루프 추적기는 생각만큼 신비하지 않습니다. 예를 들어,

모든 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> 
    } 
} 
+0

3 루프가 있다면 어떻게 될까요? –

+0

@chris - 세 개의 중첩 루프를 사용하는 또 다른 예제를 추가했습니다. 예를 들어 여분의 'OuterLoop'을 추가하여 바로 내부 루프에서 아주 바깥 쪽 루프를 참조하면됩니다. 'Loop.OuterLoop.OuterLoop' – Kev

+0

그런 말로하면, 그 속성이 재미 있지 않았다고 프로그래밍 할 수 있습니다. –

1

아우터 - 루프를 트래킹 완전히 어렵지 않다. 도우미는 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 

이것은 당신이 페이지에 걸쳐 포함한 루프의 깊이를 가질 수 있으며 여전히 작동 것을 의미한다.

도우미는 멀티 스레드 시나리오에서는 작동하지 않으며 열거자를 처리하지 않으면 오류가 발생할 수 있습니다.

+0

열거 자 처분에 대해 제기 한 진술에 당황한데, 열거 자 처분을 보여주는 코드 샘플은 없습니다. 또한'Wrap()'은 어디에서 왔습니까? –

+1

@Chris 나의 나쁜, 나는 트랙을 말하려고했지만 대신 랩을 썼다. 나는 내 대답에서 그것을 바꿨다. 또한 IEnumerator 은 IDisposable을 구현하고 일반 foreach()를 사용하는 경우 컴파일러에서 올바르게 처리되도록합니다. Enumerator를 직접 반복하는 경우 Dispose를 호출하는 것에 대해 걱정할 필요가 있습니다. var enumerator = myEnumerable.GetEnumerator(); ... – Pranav

+0

마지막 코드 줄에서 두 번째로 bar.Dispose() 여야합니까? –