我有一个viewmodel,其中包含一个Episode和一个布尔“watched”:
public class WatchedEpisodeViewModel
{
public Episode Episode { get; set; }
public bool Watched { get; set; }
}
我有一个这样的列表绑定到我的观点:
@model IEnumerable<Seriebeheer.Web.Models.WatchedEpisodeViewModel>
我列出了这些信息:
@foreach (var episode in Model)
{
<tr>
<td>@episode.Episode.ID</td>
<td>@episode.Episode.Name</td>
<td>@episode.Episode.Date.Value.ToString("dd/MM/yyyy")</td>
<td><input type="checkbox" value="@episode.Episode.ID" checked="@episode.Watched"/></td>
</tr>
}
用户可以标记复选框,然后按一个按钮提交信息。我想在我的控制器中看到哪些复选框已标记,哪些不是。
实现这一目标的最佳方式是什么?
编辑:
[HttpPost]
public ActionResult Checkin(IEnumerable<WatchedEpisodeViewModel> episodes)
{
foreach (WatchedEpisodeViewModel episode in episodes) <-- nullreference exception
{
if (episode.Watched)
{
// test
}
}
return RedirectToAction("Index", "Home");
}
答案 0 :(得分:2)
问题是您使用foreach
循环和不 for
循环。您需要使用for
循环,因为这将为每个字段提供正确的索引,以允许模型绑定器执行此操作。
您的另一个问题是,您需要在模型中的CheckBoxFor
bool上执行Watched
。
你的最后一个问题是,你的剧集字段没有HiddenFor
个,所以当你发帖时,你不会知道被观看的内容,因为模型中每个项目的剧集都会是null
请改为尝试:
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.HiddenFor(m => m[i].Episode.ID)
@Model[i].Episode.ID
</td>
<td>
@Html.HiddenFor(m => m[i].Episode.Name)
@Model[i].Episode.Name
</td>
<td>
@Html.HiddenFor(m => m[i].Episode.Date)
@Model[i].Episode.Date.Value.ToString("dd/MM/yyyy")
</td>
<td>
@Html.CheckBoxFor(m => m[i].Watched)
</td>
</tr>
}
答案 1 :(得分:0)
这是MVC中的常见问题,因为在回发到模型时很难绑定您的复选框列表。现在你可以查看FormCollection,但这真的不高效。
我之前使用过此扩展程序,使方案更加简单。 CheckBoxList(For)说明非常简单,包可在Nuget上使用。