.net core-MVC-在Viewmodel上使用IEnumerable返回空模型

时间:2018-07-09 13:51:53

标签: asp.net-mvc asp.net-core

我从引导程序中填充了可折叠的手风琴,并且每个可折叠块中都有一个表格。在GET请求中,我获得了与客户相关的所有视图模型,然后按月对它们进行分组,这使List成为IEnumerable>,然后将其发送到视图并循环,以便每个手风琴块为“ Januari”及其包含数据的表,以及等等。

因此,总结视图:我在Model中循环分组,在手风琴“键”中添加每个分组的日期,以使手风琴块具有唯一性,然后在手风琴块中添加一个表,其中包含所有行群组。表中的每一行只有一个输入,即一个复选框。

问题:提交时我什么也没收到。空列表...这是GET / POST和视图。

动作..

        [HttpGet]
    public IActionResult CheckOffPriceListsAdjustments(int projectId)
    {
        //Get all the  priceListsAdjustments that are unchecked
        var priceListsAdjustments = _priceListsAdjustmentsHandler.GetPriceListsAdjustmentsByProjectId(projectId)
            .Where(x => x.Checked.Equals(false)).ToList();

        if (priceListsAdjustments.Any())
        {
            // Transform them to checkOffViewModels.
            var checkOffViewModels = _customerHandler.GetPriceListsAdjustmentsForCheckOff(priceListsAdjustments);
            var proj = _projectService.GetProjectById(projectId).ProjectName;

            ViewBag.ProjectName = proj.Contains(";") ? proj.Substring(proj.IndexOf(';') + 1) : proj;

            var grouped = checkOffViewModels.GroupBy(x => x.Date).Select(grp => grp.ToList());

            return View(grouped);
        }

        return View();
    }

    [HttpPost]
    public IActionResult CheckOffPriceListsAdjustments(IEnumerable<List<CheckOffViewModel>> grouped)
    {
        // TODO : Update rows in DB, save changes.
        return View();
    }

查看:

@model IEnumerable<List<Blabla.Models.ViewModels.CheckOffViewModel>>
@using Blabla.Extensions


<h2>@ViewBag.ProjectName</h2>
<p id="checkOff-paragraph">blalblalblalblala....</p>

<div id="accordion">
    <form asp-controller="Customers" asp-action="CheckOffPriceListsAdjustments" method="post">
        @foreach (var group in Model)
        {
            <div class="card">
                <div class="card-header" id="heading@(group.Select(x => x.Date).FirstOrDefault())" style="background-color: #337ab7">
                    <h5 class="mb-0">
                        <span style="color:white" class="btn btn-link" data-toggle="collapse" data-target="#collapse@(group.Select(x => x.Date).FirstOrDefault())" aria-expanded="true" aria-controls="collapseOne">
                            @group.Select(x => x.Date).FirstOrDefault()
                        </span>
                    </h5>
                </div>

                <div id="collapse@(group.Select(x => x.Date).FirstOrDefault())" class="collapse show" aria-labelledby="heading@(group.Select(x => x.Date).FirstOrDefault())">
                    <div class="card-body">
                        <table id="infoTable" class="table table-fixed table-condensed">
                            <thead>
                                <tr>
                                    <th class="col-xs-3">Bockad</th>
                                    <th class="col-xs-3">Månad</th>
                                    <th class="col-xs-3">Kund</th>
                                    <th class="col-xs-3">Projektnr</th>
                                    <th class="col-xs-3">Projektnamn</th>
                                    <th class="col-xs-3">Uppgift</th>
                                    <th class="col-xs-3">Avdelning</th>
                                    <th class="col-xs-3">Name</th>
                                    <th class="col-xs-3">Antal tim</th>
                                    <th class="col-xs-3">Pris</th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach (var row in group.OrderBy(x => x.CustomerName))
                                {
                                    <tr class="clickableRow">
                                        <td class="col-xs-3"><input asp-for="@row.Checked" type="checkbox" /></td>
                                        <td class="col-xs-3">@row.Date</td>
                                        <td class="col-xs-3">@row.CustomerName</td>
                                        <td class="col-xs-3">@row.ProjNr</td>
                                        <td class="col-xs-3">@row.ProjName.TruncateString()</td>
                                        <td class="col-xs-3">@row.Description</td>
                                        <td class="col-xs-3">@row.SecCost</td>
                                        <td class="col-xs-3">@row.Employee</td>
                                        <td class="col-xs-3">@row.Hours</td>
                                        <td class="col-xs-3">@row.Price</td>
                                        <td><input type="hidden" asp-for="@row.Checked" /></td>
                                        <td><input type="hidden" asp-for="@row.PriceListsAdjustmentsId" /></td>
                                    </tr>
                                }
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        }
        <div class="form-group" style="text-align: center; padding-top: 20px">
            <input id="checkOffPricelists-form-btn" type="submit" value="save blabla.." class="btn btn-success" style="width:25%" disabled />
        </div>
    </form>
</div>

1 个答案:

答案 0 :(得分:1)

如前所述,您需要使用for循环遍历模型集合,并通过索引引用项目。您还需要使用诸如TextboxFor之类的控件来使绑定起作用。

您可以看到两者之间源代码中生成的html的区别。

谢谢