复选框 - 如何实现?

时间:2013-02-20 12:11:56

标签: c# asp.net-mvc razor

我有一个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");
}

2 个答案:

答案 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上使用。