カミソリビューで出力したいアイテムのリストがあります。次のように、各項目の間に区切り線を追加します。
item1 | item2 | item3
アイテムをループする最も簡単な方法は、foreach を使用することです。
@foreach(var item in Model.items){
<span>@item.Name</span> |
}
残念ながら、これにより、リストの最後に余分な区切り線が追加されます。この最後の区切り線をスキップする簡単な方法はありますか?
カミソリビューで出力したいアイテムのリストがあります。次のように、各項目の間に区切り線を追加します。
item1 | item2 | item3
アイテムをループする最も簡単な方法は、foreach を使用することです。
@foreach(var item in Model.items){
<span>@item.Name</span> |
}
残念ながら、これにより、リストの最後に余分な区切り線が追加されます。この最後の区切り線をスキップする簡単な方法はありますか?
使用できます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)))
ここにある他の回答とインラインテンプレートに関するこの記事を組み合わせて、拡張クラスに入れることができるこのヘルパーメソッドを思いつきました。
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をサポートします。
これが最も簡単な方法なのか、それともよりエレガントな方法なのかはわかりませんが、次のようなことができます。
@foreach ( var item in Model.items){
<span>@item.Name</span> @(Model.items[Model.items.Count - 1] != item ? "|" : "")
}
item
つまり、基本的に、がリストの最後の項目であるかどうかを確認しています。
このコードサンプルは試していませんので、tweekする必要があるかもしれません。
カウンタ変数をループ内に保持し、最後のアイテムかどうかを確認します。
@{ 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?"|":"")
}