2013-03-18 3 views
10

면도날 뷰로 출력 할 항목 목록이 있습니다. 각 항목 사이에 나는이 같은 구분선을 추가 할 :면도기의 목록을 반복하고 항목 사이에 구분 기호를 추가하십시오.

@foreach(var item in Model.items){ 
    <span>@item.Name</span> | 
} 

불행하게도이 말에 추가 구분선을 추가

item1 | item2 | item3 

가장 간단한 방법은 루프 항목을 통해하는 것은 foreach는 함께 목록의. 이 마지막 구분선을 건너 뛰는 간단한 방법이 있습니까?

답변

18

@{ int counter=0; } 
@foreach(var item in Model.items){ 
    counter++; 
    <span>@item.Name</span> 
    if(counter<Model.Items.Count) 
    { 
    @Html.Raw("|") 
    } 
} 

과 짧은 버전입니다.

당신은 더 복잡 마크 업에 대한 면도기 @helper 방법이 혼합 할 수 있습니다

public static HtmlString LoopWithSeparator 
    (this HtmlHelper helper, string separator, IEnumerable<object> items) 
{ 
    return new HtmlString 
      (helper.Raw(string.Join(separator, items)).ToHtmlString()); 
} 

사용법 :

@helper ComplexMarkup(ItemType item) 
{ 
    <span>@item.Name</span> 
} 

@Html.Raw(string.Join("|", model.Items.Select(s => ComplexMarkup(s)))) 

당신은 심지어 추상적으로 도우미 방법 Html.Raw()string.Join() 전화를 만들 수 있습니다

@Html.LoopWithSeparator("|", model.Items.Select(s => ComplexMarkup(s))) 
+0

+1 다른 것보다 더 우아함 ... –

+0

이것은 매우 간단한 루프 바디에만 적합합니다. – Marius

+0

참, 앞면 개선을 위해 편집 참조 ... – Oliver

2

가장 간단한 방법인지, 아니면 좀 더 우아한 방법인지는 모르겠지만 다음과 같이 할 수 있습니다.

@foreach (var item in Model.items){ 
    <span>@item.Name</span> @(Model.items[Model.items.Count - 1] != item ? "|" : "") 
} 

그래서 당신은 기본적으로 item이 목록의 마지막 항목이 있는지 확인합니다.

이 코드 샘플은 아직 시험하지 않았으므로 tweek해야 할 수도 있습니다.

2

카운터 변수를 루프 내부에 유지하고 루프가 마지막 항목인지 여부를 확인하십시오.

@Html.Raw(string.Join("|", model.Items.Select(s => string.Format("<span>{0}</span>", s.Name)))) 

string.Join를 사용하여 마지막 항목을 확인해야 할 필요성을 부정 : 당신은 string.Join을 사용할 수 있습니다

@{ int counter=0; } 
@foreach(var item in Model.items){ 
    counter++; 
    <span>@item.Name</span> @(counter< Model.items.Count?"|":"") 
} 
+0

이 나는 ​​일이 같은 것을 얻을 수있는 방법을 발견 적이 있기 때문에 나는 그것을 할 거라고 방법은 다음과 같습니다 가 싶어요 @for을 (내가 ++; Model.items.Count I = 0 INT) 그것이 어떻게 끝 났는지 알 수 있습니다. – sanepete

2

결합 그 다음이에서 HTML을 지원

@Model.ListOfItems.Join(
    @<a href="@item.Href"> 
     @item.Name 
    </a>, 
    @<text> | </text>) 

public static HelperResult Join<T>(this IEnumerable<T> list, Func<T, HelperResult> template, Func<T, HelperResult> separator) 
{ 
    var first = true; 
    var result = new HelperResult(writer => 
    { 
     foreach (var item in list) 
     { 
      if (first == false) 
       separator(item).WriteTo(writer); 
      first = false; 
      template(item).WriteTo(writer); 
     } 
    }); 

    return result; 
} 

사용하는 방법 : 여기 this article on inline templates와 다른 답변, 내가 확장 클래스에 배치 할 수있는이 도우미 메서드, 함께했다 항목과 구분 기호 모두.

관련 문제