在 post 之后取回空模型

Getting back null model after post

好像很多人都有这个问题,但我还没有找到针对我的具体情况的解决方案。

我首先将门票发送到我的视图

[HttpGet]
    public ActionResult AddPopcorn()
    {
        List<Ticket> tickets = new List<Ticket>();
        // Fill the list with tickets
        return View("AddPopcorn", tickets);
    }

在视图中,我用表单和复选框显示票证。视图正确显示票证。

@model List<Domain.Entities.Ticket>

@{
    ViewBag.Title = "AddPopcorn";
}

<body>
  // Html stuff
        @using (Html.BeginForm("AddPopcorn", "Ticket", FormMethod.Post))
        {
            <table>
                @foreach (var item in Model)
                {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.TicketID)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Price)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.TicketType)
                    </td>
                    <td>
                        @Html.CheckBoxFor(modelItem => item.Popcorn)
                    </td>
                </tr>
                }
            </table>
            <input type="submit" value="Voeg toe!" />
        }
    </div>
</body>

如果人们选中复选框,我希望值 'Popcorn' 为真。因此,我希望视图 return 包含基于复选框的爆米花更新值的票证列表。

    [HttpPost]
    public ActionResult AddPopcorn(List<Ticket> model)
    {
        foreach (var item in model)
        {
            if (item.Popcorn == true)
            {
                item.Price = item.Price + 5;
            }
        }
        return RedirectToAction("Payment", "Payment");
    }

但是,return添加到 AddPopcorn 的模型为空。我似乎无法弄清楚为什么。

这是因为您的表单实际上并未将任何数据发送回控制器。

您需要输入元素才能真正从表单中检索数据。

相反,在控制器上,以这种方式访问​​模型:

var model = this.Model

表单将发送您在输入标签中获得的数据,例如

<input type="text" name="first_name" />

尝试将 foreach 循环更改为 for:

for (int i = 0; i < Model.Count; i++)
{
  <tr>
    <td>
      @Html.DisplayFor(x => Model[i].TicketID)
    </td>

    <td>
      @Html.DisplayFor(x => Model[i].Price)
    </td>

    // etc 

    <td>
      @Html.CheckBoxFor(x => Model[i].Popcorn)
    </td>        
  </tr>   
}

默认模型绑定器使用特定约定来确定如何绑定项目列表,例如 Model[0].Popcorn(名称)。您可以检查 CheckBox 的 HTML 是否具有设置为该格式的 name 属性。

除了使用 for,您还可以为 Ticket 对象指定自定义 EditorTemplate