Простой синтаксис шаблонов, включающий запятую для разделения имен - PullRequest
20 голосов
/ 29 марта 2012

У меня есть следующий шаблон бритвы HTML, хотя я не могу понять, как добавить запятую для разделения имен в разметке !?При попытке следующего кода я получаю ; expected как ошибку компилятора !.Мне также нужно удалить последнюю запятую.

@foreach (People person in Model.People)
{
  person.Name,
}

Я хочу: Тед, Джеймс, Дженни, Том

Ответы [ 7 ]

45 голосов
/ 29 марта 2012

А как насчет string.Join вместо foreach (он даже решает запятую после последней проблемы с элементом):

@String.Join(", ", Model.People.Select(p => p.Name).ToArray())
4 голосов
/ 29 марта 2012

Вы можете использовать <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() это более чистый способ сделать это.Если вы создаете более сложную разметку, вам, вероятно, потребуется использовать цикл.

3 голосов
/ 25 февраля 2015

Вы можете получить результат компактным способом, используя троичный оператор

@foreach (People person in Model.People)
{
  @person.Name@((person != Model.People.Last()) ? "," : "")
}               
1 голос
/ 05 мая 2017

Идея для сценария, в котором вам нужно сделать дополнительные «вещи» в цикле 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>
}
0 голосов
/ 29 марта 2012

Попробуйте это:

bool firstIteration = true

@foreach (People person in Model.People)
{

if(firstIteration)

{

  @: person.Name

}

else

{

 @: "," + person.Name

}

firstIteration = false;

} 
0 голосов
/ 29 марта 2012
@foreach (People person in Model.People)
{
  person.Name<text>,&nbsp;</text>
}

или лучше:

string.Join(", ", Model.People.Select(x => x.Name).ToArray()) 
0 голосов
/ 29 марта 2012

Попробуйте что-то вроде

@foreach (People person in Model.People)
{
  @person.Name<text>,</text>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...