【问题标题】:Looping through models content in Razor在 Razor 中循环浏览模型内容
【发布时间】:2012-10-25 23:06:11
【问题描述】:

我想在我的剃刀视图中循环浏览模型中的每个项目,但我想将所有项目组合在一起。然后我想遍历每个组。想象一下我有一张桌子:

ID   GroupNo    GroupName
1    1          Group1
2    1          Group2
3    1          Group3
4    2          Group1
5    2          Group2
6    3          Group56

我想做这样的事情:

@foreach (var group in Model.GroupNo) {
    <section>
        <header>Group No is @group.GroupNo</header>
        @foreach (var item in group) {
            <p>GroupName: @item.GroupName</p>
        }
    </section>
} 

所以我的输出是:

Group No is 1
GroupName: Group1
GroupName: Group2
GroupName: Group3
Group No is 2
GroupName: Group1
GroupName: Group2
Group No is 3
GroupName: Group56

这可能吗?

谢谢

【问题讨论】:

  • 您是否真的尝试为您的模型数据结构提供与您的(乍一看是有效的)Razor 代码所期望的相匹配的数据结构?
  • GroupNo 绝对不是 IEnumerable 对吧?我在问你正在做一个 foreach

标签: c# asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

是的,使用 Linq GroupBy 很容易做到这一点。我建议将您的视图更改为使用 @model IEnumerable&lt;IGrouping&lt;string, MyModel&gt;&gt;,您可以这样填充:

var groupModel = MyModelCollection.GroupBy(item => item.GroupNo).ToArray();
return View(groupModel);

然后,只需按照您编写的方式遍历组,除了使用 group.Key 而不是 group.GroupNo 来检索 IGrouping 的密钥:

@foreach (var group in Model) {
    <section>
        <header>Group No is @group.Key</header>
        @foreach (var item in group) {
            <p>GroupName: @item.GroupName</p>
        }
    </section>
} 

【讨论】:

  • 完美运行!! :) 非常感谢
  • 这太棒了,但是如何将它传递回控制器?
【解决方案2】:

LINQ 可以帮助您做到这一点

@model IEnumerable<Project1.Models.Group>


@foreach (var item in Model.Select(i=>i.groupno).Distinct().ToList()) {
    <tr>
        <td>
            <header>Group No is @item</header>
            @foreach (var grpName in Model.Where(i => i.groupno == item).ToList())
            {
                <p>GroupName: @grpName.groupName</p>
            }
        </td>
    </tr>
}

【讨论】:

  • 这个逻辑为我节省了很多时间。谢谢!
  • 如果您需要将分组代码完全保留在您的视图中,这是一个很好的方法。
【解决方案3】:
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>

        @{
            String[] name = {"Prashant", "Rishabh", "Zaheer", "Pratima", "Rahul"};
            int i = 1;
            while (i <= 5)
            {
                foreach(var x in name)
                {
                       <p>@i.  @x</p>
                       i++;
                };
                break;
            }
        }
    </div>
</body>
</html>

O/p-
1. Prashant

2. Rishabh

3. Zaheer

4. Pratima

5. Rahul

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多