Html.CheckBox("SelectedStudents", false, new { @class = "check-item", id = x.Id, value = x.Id })
产生
<input checked="checked" class="check-item" id="4507" name="SelectedStudents" value="4507" type="checkbox">
<input checked="checked" class="check-item" id="4507" name="SelectedStudents" value="4508" type="checkbox">
<input checked="checked" class="check-item" id="4507" name="SelectedStudents" value="4509" type="checkbox">
在mvc模型中我有
public IEnumerable<string> SelectedStudents { get; set; }
但是当我回发时,SelectedStudents总是为空。为什么? 在这个howto http://benfoster.io/blog/checkbox-lists-in-aspnet-mvc中 写道:
ASP.NET MVC模型绑定器非常智能,可以映射所选项目 这个属性。
但在我的例子中总是为空。为什么?如何写更多复选框并将其绑定回来
答案 0 :(得分:9)
您应该使用强类型编辑器将结果传递给控制器(模型绑定器)。
我更喜欢这样做。
<强>模型强>
public class YourViewModel
{
public List<SelectListItem> Students
{
get;
set;
}
}
控制器获取
Students= service.GetStudents(); //Fill the list
查看强>
@for (var i = 0; i < Model.Students.Count; i++)
{
@Html.CheckBoxFor(m => m.Students[i].Selected)
@Html.HiddenFor(m => m.Students[i].Text)
@Html.HiddenFor(m => m.Students[i].Value)
<span>@Model.Students[i].Text</span>
}
控制器发布
[HttpPost]
public ActionResult Create(YourViewModel model)
{
foreach(var student in model.Students)
{
if(student.Selected) { // Do your logic}
}
}
替代地 您可以使用数组或字符串列表。 此示例中使用了ListBox。
public string[] SelectedStudents{ get; set; }
@Html.ListBoxFor(s => s.SelectedStudents, new MultiSelectList(Model.Students, "Value", "Text", Model.SelectedStudents), new { @class = "form-control", style = "height:250px; width:100%" })
答案 1 :(得分:1)
请在此处查看我的回答How to bind checkbox values to a list of ints?。
关于这一点的好处是它可以很好地区分控制器和ui之间的关注点。 html扩展方法还使用标签和输入为复选框创建正确的html。并且不需要隐藏的领域。
答案 2 :(得分:0)
你用CheckBoxListFor尝试吗?您需要将复选框与模型关联,并且不应具有相同的ID和名称
@Html.CheckBoxListFor(model => model.SelectedSources, Model.SubscriptionSources)
答案 3 :(得分:0)
您需要使用可变类型,例如List<string>
。
public List<string> SelectedStudents { get; set; }