在 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
。
好像很多人都有这个问题,但我还没有找到针对我的具体情况的解决方案。
我首先将门票发送到我的视图
[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
。