【问题标题】:ASP.NET MVC - Adding multiple model items to a single columnASP.NET MVC - 将多个模型项添加到单个列
【发布时间】:2016-06-11 23:10:21
【问题描述】:

对于我的 MVC 项目,我想将模型元素添加到以下格式的表中:

╦═══════════╦ ║ 赛季# ║ &lt------(SeasonID Selector DDL) ╩═══════════╩ ╔═══╦═══════════╦════════════════════════╕ ║ ║ 球队名称 ║ 球员姓名 ║ ╠═══╬═══════════╬════════════════════════╕ ║ 1 ║ GSW ║ PlayerA PlayerB PlayerC ║ ║║║玩家D玩家E║ ║ 2 ║ OKC ║ PlayerA PlayerB PlayerC ║ ║║║玩家D玩家E║ ║ 3 ║ CLE ║ PlayerA PlayerB PlayerC ║ ║║║玩家D玩家E║ ║ 4 ║ SAS ║ PlayerA PlayerB PlayerC ║ ║ 5 ║ TOR ║ PlayerA PlayerB PlayerC ║ ╚═══╩═══════════╩════════════════════════╕

我设法通过将SeasonTeam 添加到Viewbag list 并遍历Season 中的每个Team 名称来做到这一点。然后,我将遍历Roster 模型中的每个项目,并将其与Viewbag list 中的SeasonTeamID 进行比较,因此如果Viewbag list.seasonTeamID == model.SeasonTeamID,则将玩家名称添加到行中。我认为下面的代码可以帮助解释。

实体之间的关系:Link

名册型号:

public partial class Roster
{
    public int RosterID { get; set; }
    public int SeasonTeamID { get; set; }
    public int PlayerID { get; set; }

    public virtual Player Player { get; set; }
    public virtual SeasonTeam SeasonTeam { get; set; }
}

索引:

@using (Html.BeginForm())
{
    <p>
        @Html.DropDownList("seasonID", (SelectList)ViewBag.SeasonList, new { onchange = "this.form.submit();" })
    </p>
}
<table class="table"> 
    <tr>
        <th></th>
        <th>
            @Html.DisplayNameFor(model => model.SeasonTeamID)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SeasonTeam.Team.TeamName)
        </th>
        <th>
            @Html.DisplayName("Player List")
        </th>

        <th></th>
    </tr>

@{ 
    int rowCount = 0;
    var team = (List<SeasonTeam>)ViewBag.teamList;
}
@foreach (var t in team)
{
    <tr>
        <td>@(rowCount += 1)</td>
        <td>
            @Html.DisplayFor(modelItem => t.SeasonTeamID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => t.Team.TeamName)
        </td>
        <td>
            @* Loop through each player in roster *@
            @{ var modelList = Model.ToList();}
            <div class="row">
                @for (int i = 0; i < modelList.Count; i++)
                {
                    if (modelList[i].SeasonTeamID == t.SeasonTeamID)
                    {
                        if (i % 3 == 0 && i != 0)
                        {
                            @:</div><div class="row"> 
                            <div class="col-md-3">@modelList[i].Player.LastName</div>
                        }
                        else
                        {
                            <div class="col-md-3">@modelList[i].Player.LastName</div>
                        }                        
                    }                    
                }
            </div>
            @*End loop*@
        </td>

        <td>
            @Html.ActionLink("Edit", "Edit", new { id = t.SeasonTeamID }) |
            @Html.ActionLink("Details", "Details", new { id = t.SeasonTeamID })
        </td>       
    </tr>
}

名册控制器:

    public ActionResult Index(int? seasonID)
    {
        var rosters = db.Rosters.Include(r => r.SeasonTeam).Where(r => r.SeasonTeam.SeasonID == seasonID).OrderBy(t => t.SeasonTeam.Team.TeamName);



        var sList = db.Seasons.OrderByDescending(a => a.SeasonID).ToList()
            .Select(s => new
            {
                SeasonID = s.SeasonID,
                Desc = "Season " + s.SeasonID
            });
        ViewBag.SeasonList = new SelectList(sList, "SeasonID", "Desc", seasonID);

        var steam = db.SeasonTeams.Include(r => r.Team).Where(r => r.SeasonID == seasonID).OrderBy(r => r.Team.TeamName);
        ViewBag.teamList = steam.ToList();

        return View(rosters.ToList());
    }

问题是我不想遍历model 中的每个玩家(并将其SeasonTeamID 与团队列表的SeasonTeamID 进行比较),尤其是当我遍历团队名称时每个赛季将有大约 100 多人参加比赛。有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework razor


    【解决方案1】:

    最初的建议是改变这一点:

    var modelList = Model.ToList();
    

    为此:

    var modelList = Model.Where(x => x.SeasonTeamID == t.SeasonTeamID).ToList();
    

    因此,modelList 现在只会包含您感兴趣的玩家,因此您不必逐一迭代,并且可以消除这个“如果”:

    if (modelList[i].SeasonTeamID == t.SeasonTeamID)
    

    【讨论】:

    • 哇,这是一个如此简单的解决方案。谢谢!我对此很陌生(在这个项目上工作了大约 2 个月),我认为我只能在控制器中执行 .Where(x =&gt; x.SeasonTeamID == t.SeasonTeamID)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多