【发布时间】:2012-04-12 20:50:39
【问题描述】:
我有以下 razor 模板 html,虽然我不知道如何在标记中包含逗号来分隔名称!?尝试以下代码时,我得到; expected 作为编译器错误!。我还需要删除最后一个逗号。
@foreach (People person in Model.People)
{
person.Name,
}
我想要:泰德、詹姆斯、珍妮、汤姆
【问题讨论】:
我有以下 razor 模板 html,虽然我不知道如何在标记中包含逗号来分隔名称!?尝试以下代码时,我得到; expected 作为编译器错误!。我还需要删除最后一个逗号。
@foreach (People person in Model.People)
{
person.Name,
}
我想要:泰德、詹姆斯、珍妮、汤姆
【问题讨论】:
string.Join而不是foreach呢(它甚至解决了最后一个项目后的逗号问题):
@String.Join(", ", Model.People.Select(p => p.Name).ToArray())
【讨论】:
@Html.Raw(String.Join(", ", Model.People.Select(p => Html.ActionLink(p.Name, "Details").ToHtmlString()).ToArray()))
Html.Encodep.Name 不是一个好主意吗?另外,是否需要ToArray?
您可以使用 <text></text> 在 Razor 模板中包含文字内容。要省略最后一个逗号,我会使用for 循环而不是foreach。
@{
var peopleList = Model.People.ToList();
for( int i = 0; i < peopleList.Count; i++ )
{
@peopleList[i].Name
if( i < peopleList[i].Count - 1 )
{
<text>,</text>
}
}
}
正如@nemesv 指出的那样,如果您所做的只是创建和显示一个分隔字符串,那么string.Join() 是一种更简洁的方式来完成此任务。如果您要构建更复杂的标记,您可能需要使用循环。
【讨论】:
您可以使用三元运算符以紧凑的方式获得结果
@foreach (People person in Model.People)
{
@person.Name@((person != Model.People.Last()) ? "," : "")
}
【讨论】:
People 集合很大,这将导致运行时性能不佳。尤其是如果Model.People 是一个实时的 EF 数据库实体集对象。
一个想法,你需要在 foreach 循环中做额外的“东西”,而不仅仅是渲染显示。
// index.cshtml
@{ var lastPerson = Model.People.LastOrDefault(); }
@foreach (People person in Model.People)
{
var display = person != lastPerson ? $"{person.Name}, " : person.Name;
<a href="@person.Href">@display</a>
}
或者,如果你和我一样,想尝试将比较和解析逻辑排除在视图之外,你可以编写一个简单的扩展方法。
// StringExtensions.cs
public class StringExtensions
{
public static string DisplayAsCommaListItem(
this string str, object currentItem, object lastItem)
{
return currentItem != lastItem ? $"{str}, " : str;
}
}
那么视图代码就变成了..
// index.cshtml
@{ var lastPerson = Model.People.LastOrDefault(); }
@foreach (People person in Model.People)
{
<a href="@person.Href">@person.Name.DisplayAsCommaListItem(person, lastPerson)</a>
}
【讨论】:
@foreach (People person in Model.People)
{
person.Name<text>, </text>
}
或更好:
string.Join(", ", Model.People.Select(x => x.Name).ToArray())
【讨论】:
试试这个:
bool firstIteration = true
@foreach (People person in Model.People)
{
if(firstIteration)
{
@: person.Name
}
else
{
@: "," + person.Name
}
firstIteration = false;
}
【讨论】:
试试类似的东西
@foreach (People person in Model.People)
{
@person.Name<text>,</text>
}
【讨论】:
Ted,James,Jenny,Tom, 而不是Ted, James, Jenny, Tom