2013-03-18 9 views
10

私は剃刀のビューで出力したいアイテムのリストを持っています。私は、区切り線を追加したい各項目の間には、次のように:剃刀でリストをループし、アイテム間にセパレータを追加する

item1 | item2 | item3 

項目をループする最も簡単な方法は、foreachのである:

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

残念ながら、これは最後に余分な区切り線を追加しますリストのこの最後のセパレータ行をスキップする簡単な方法はありますか?

答えて

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(I = 0をint型; Model.items.Countを、私は++) するのが大好きですそれがどのように行われたか知っている。 – sanepete

2

ここthis article on inline templatesと他の回答、私は拡張クラスに入れることができ、このヘルパーメソッド、思い付いた:それを使用する方法は、その後

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

だろう。これは、中にHTMLをサポートしてい

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; 
} 

項目とセパレータの両方。

関連する問題