我有一个视图需要一些描述一周中几天的复选框。我想返回控制器选择哪些框。我从各种谷歌搜索等中找到了一些帮助,这就是我所拥有的。
第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参数中看到所选日期。但是,我很好奇,并将复选框上的'name'属性更改为我的模型中的字段,我最终希望这些值转到。总之,我的视图模型包含一个包含List的对象。该List是我希望所选值最终得到的集合。但这是相关的代码。
第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节中的代码可用于我的情况,我可以进行一些字符串解析等。是否可以从一个集合(Model.AllDays)填充Checkbox组并返回第二个集合(Model .CronTabModel.On)?
答案 0 :(得分: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"
Etc等。
关于数组绑定的更多阅读http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx