1

我有一个视图模型,其中包含一个情节和一个布尔值“已观看”:

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");
}
4

2 回答 2

2

问题是您使用的是循环foreach不是for循环。您需要使用for循环,因为这将为每个字段提供正确的索引,以允许模型绑定器完成它的工作。

您的另一个问题是您需要对模型CheckBoxFor中的Watched布尔值进行处理。

您的最后一个问题是您的 Episode 字段没有任何HiddenFors,因此当您发布时,您将不知道模型中每个项目上的 Episode 将被观看什么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>
}
于 2013-02-20T13:22:02.347 回答
0

这是 MVC 中的一个常见问题,因为在发回模型时很难绑定复选框列表。现在您可以查看 FormCollection ,但这确实效率不高。

我之前使用过这个扩展,它使场景变得更加简单。CheckBoxList(For)说明非常简单,包在 Nuget 上可用。

于 2013-02-20T12:14:57.317 回答