我有一个我想在剃刀视图中输出的项目列表。在每个项目之间我想添加一个分隔线,如下所示:
item1 | item2 | item3
循环项目的最简单方法是使用foreach:
@foreach(var item in Model.items){
<span>@item.Name</span> |
}
不幸的是,这会在列表末尾添加一个额外的分隔线。是否有一种简单的方法可以跳过最后一个分隔线?
答案 0 :(得分: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()
和string.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)))
答案 1 :(得分:3)
将这里的其他答案与this article on inline templates结合起来,我想出了这个辅助方法,可以放在扩展类中:
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。
答案 2 :(得分:2)
不确定这是否是最简单的方法,或者这些方式是否更优雅,但您可以做类似的事情;
@foreach ( var item in Model.items){
<span>@item.Name</span> @(Model.items[Model.items.Count - 1] != item ? "|" : "")
}
所以你基本上要检查item
是否是列表中的最后一项。
未尝试此代码示例,因此您可能需要对其进行调整。
答案 3 :(得分: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?"|":"")
}