12

カミソリビューで出力したいアイテムのリストがあります。次のように、各項目の間に区切り線を追加します。

item1 | item2 | item3

アイテムをループする最も簡単な方法は、foreach を使用することです。

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

残念ながら、これにより、リストの最後に余分な区切り線が追加されます。この最後の区切り線をスキップする簡単な方法はありますか?

4

4 に答える 4

20

使用できますstring.Join

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

を使用string.Joinすると、最後の項目をチェックする必要がなくなります。

これを Razor メソッドと組み合わせて、@helperより複雑なマークアップを作成できます。

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

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

Html.Raw()andstring.Join()呼び出しを抽象化するヘルパー メソッドを作成することもできます。

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

使用法:

@Html.LoopWithSeparator("|",  model.Items.Select(s => ComplexMarkup(s)))
于 2013-03-18T15:27:04.823 に答える
3

ここにある他の回答とインラインテンプレートに関するこの記事を組み合わせて、拡張クラスに入れることができるこのヘルパーメソッドを思いつきました。

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

その場合の使用方法は次のようになります

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

これは、アイテムとセパレーターの両方でhtmlをサポートします。

于 2013-03-19T09:23:45.390 に答える
2

これが最も簡単な方法なのか、それともよりエレガントな方法なのかはわかりませんが、次のようなことができます。

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

itemつまり、基本的に、がリストの最後の項目であるかどうかを確認しています。

このコードサンプルは試していませんので、tweekする必要があるかもしれません。

于 2013-03-18T15:25:26.727 に答える
2

カウンタ変数をループ内に保持し、最後のアイテムかどうかを確認します。

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

そして短いバージョンは

@{ int counter=0; }
@foreach(var item in Model.items){
  counter++;
  <span>@item.Name</span> @(counter< Model.items.Count?"|":"")
 } 
于 2013-03-18T15:26:24.443 に答える