2

我有一个视图,需要一些复选框来描述一周中的几天。我想返回控制器选择了哪些框。我从各种谷歌搜索等中找到了一些帮助,这就是我所拥有的。

第 1 节:

在控制器中:

vm.AllDays = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>().ToList();

在视图中:

@foreach (var day in Model.AllDays) {
   <input type="checkbox" name="days" value="@day"/> <label>@day</label><br />
}

然后在我的帖子处理程序中:

[HttpPost]
public ActionResult _AddEdit(SubscriptionDetailsModel vm, IEnumerable<string> days) {
    //etc, etc, etc
}

这行得通,我在 days 参数中获得了选定的日期。但是,我很好奇并将复选框上的“名称”属性更改为模型中我最终希望这些值转到的字段。总之,我的视图模型包含一个对象,其中包含一个列表。该列表是我希望所选值最终出现的集合。但这是相关代码。

第 2 节

模型片段:

public class SubscriptionDetailsModel {
    public CronTabModel CrontabModel { get; set; }
    //...
}

public class CronTabModel {
    public List<DayOfWeek> On { get; set; }
}

控制器:

[HttpPost]
public ActionResult _AddEdit(SubscriptionDetailsModel vm) {
    //etc, etc, etc
}

当然,查看:

@foreach (var day in Model.AllDays) {
    <input type="checkbox" name="On" value="@day"/> <label>@day</label><br />
}

编辑:我看到令人困惑的结果的原因是由于我的视图中其他地方的拼写错误。

从技术上讲,第 1 节中的代码适用于我的情况,我可以进行一些字符串解析等。是否可以使 Checkbox 组从一个集合(Model.AllDays)填充并在第二个集合(Model.CronTabModel.上)?

4

1 回答 1

1

模型绑定到列表有点尴尬,但可能。MVC 存在索引差距的问题,他们确实构建了一个帮助程序来修复它。隐藏字段让 MVC 知道间隙,因此它可以有效地绑定。

@for (var index =; index < Model.AllDays.Count(); index++) {
    @Html.Hidden("AllDays.Index", index)
    @Html.CheckBoxFor(m => Model.AllDays[Index], new { Value= Model.AllDays[index] }
    <label>@Model.AllDays[Index]</label><br />
}

这应该让您绑定到一个复选框列表,这些复选框将其值返回并绑定到模型上名为 AllDays 的属性。

如果您想更改名称,则需要更改您传递的模型上的名称。这样做允许 MVC 将索引器添加到名称中,因此您最终会得到

AllDays[0] = "Sunday"
AllDays[1] = "Monday"

等等等等。

更多关于数组绑定的阅读http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

于 2013-06-18T08:57:44.433 回答