【问题标题】:Simple razor templating syntax to include a comma to separate the names简单的剃须刀模板语法,包括逗号来分隔名称
【发布时间】:2012-04-12 20:50:39
【问题描述】:

我有以下 razor 模板 html,虽然我不知道如何在标记中包含逗号来分隔名称!?尝试以下代码时,我得到; expected 作为编译器错误!。我还需要删除最后一个逗号。

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

我想要:泰德、詹姆斯、珍妮、汤姆

【问题讨论】:

    标签: c# .net html razor


    【解决方案1】:

    string.Join而不是foreach呢(它甚至解决了最后一个项目后的逗号问题):

    @String.Join(", ", Model.People.Select(p => p.Name).ToArray())
    

    【讨论】:

    • +1,此外,虽然它可能会有点乱,你也可以扩展它以使用 ActionLinks:@Html.Raw(String.Join(", ", Model.People.Select(p => Html.ActionLink(p.Name, "Details").ToHtmlString()).ToArray()))
    • 4 年后,LINQ 仍然让我惊叹。
    • Html.Encodep.Name 不是一个好主意吗?另外,是否需要ToArray
    【解决方案2】:

    您可以使用 <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() 是一种更简洁的方式来完成此任务。如果您要构建更复杂的标记,您可能需要使用循环。

    【讨论】:

    • 只是一个小问题,但这不会在每个循环中调用 Count() 方法/扩展两次吗?
    • 是的。如果你有5个名字,那没什么大不了的。如果你有 5000 个名字,那么一定要计算一次 count 并将其存储在一个变量中。
    【解决方案3】:

    您可以使用三元运算符以紧凑的方式获得结果

    @foreach (People person in Model.People)
    {
      @person.Name@((person != Model.People.Last()) ? "," : "")
    }               
    

    【讨论】:

    • 如果您的 People 集合很大,这将导致运行时性能不佳。尤其是如果Model.People 是一个实时的 EF 数据库实体集对象。
    【解决方案4】:

    一个想法,你需要在 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>
    }
    

    【讨论】:

      【解决方案5】:
      @foreach (People person in Model.People)
      {
        person.Name<text>,&nbsp;</text>
      }
      

      或更好:

      string.Join(", ", Model.People.Select(x => x.Name).ToArray()) 
      

      【讨论】:

        【解决方案6】:

        试试这个:

        bool firstIteration = true
        
        @foreach (People person in Model.People)
        {
        
        if(firstIteration)
        
        {
        
          @: person.Name
        
        }
        
        else
        
        {
        
         @: "," + person.Name
        
        }
        
        firstIteration = false;
        
        } 
        

        【讨论】:

          【解决方案7】:

          试试类似的东西

          @foreach (People person in Model.People)
          {
            @person.Name<text>,</text>
          }
          

          【讨论】:

          • 这将导致Ted,James,Jenny,Tom, 而不是Ted, James, Jenny, Tom
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多