我有化合物表的下列数据库表(元素周期表中的化合物/元素)表数据中有拼写错误,所以忽略它们
数据是:
控制器:
public class CheckboxController : Controller
{
//
// GET: /Checkbox/
testdbEntities db = new testdbEntities();
[HttpGet]
public ActionResult Index()
{
var comps = db.Compounds.Select(c => new CompoundModel { Id=c.Id, CompoundName=c.Name, IsSelected=c.IsSelected}).ToList();
CheckboxVM cvm = new CheckboxVM { checkboxData=comps};
return View(cvm);
}
[HttpPost]
public string Index(IEnumerable<CheckboxVM> collection)
{
return "";
}
}
模型类CompoundModel是:
public class CompoundModel
{
public int Id { get; set; }
public string Code { get; set; }
public string CompoundName { get; set; }
public bool IsSelected { get; set; }
}
和ViewModel CheckBoxVM:
public class CheckboxVM
{
public string Id { get; set; }
public string CompoundNmae { get; set; }
public bool IsSelected { get; set; }
public IEnumerable<CompoundModel> checkboxData { get; set; }
}
当页面加载时,它应该显示带有名称的复选框,如果db表已经检查了它们(IsSelected=1)
那么它们应该被检查。在帖子后面我需要接收用户检查的{{ 1}}。目前,我的代码符合第一个要求,即在页面加载时根据checkboxes
检查已选中的checkboxes
。有办法解决这个问题吗?
如果你需要一个带调试的视频,请问我很乐意发帖:)
观点:(更新)
IsSelected
答案 0 :(得分:2)
您不能使用foreach
循环来生成表单控件。它会生成重复的name
属性(与您的模型没有关系)和重复的id
属性(无效的html)。
为您的模型创建自定义`EditorTemplate
在/Views/Shared/EditorTemplates/CompoundModel.cshtml
@model recitejs1.Models.CompoundModel
@Html.HiddenFor(m => m.Id)
@Html.HiddenFor(m => m.CompoundName)
@Html.CheckBoxFor(m => m.IsSelected)
@Html.LabelFor(m => m.CompoundName)
然后在主视图中
@model recitejs1.Models.CheckboxVM
....
@using (Html.BeginForm())
{
@Html.EditorFor(m => m.checkboxData)
<input type="submit" name="name" value="Send" />
}
EditorFor()
方法会为集合中的每个项目生成正确的html
注意:您应该在进行此更改之前和之后检查html,以便更好地了解模型绑定的工作原理。
另请注意,您的POST方法参数必须为
public string Index(CheckboxVM model)
因为这是视图的基础。但是,您在视图中使用CheckboxVM
的唯一属性是IEnumerable<CompoundModel> checkboxData
,在这种情况下,您的视图应为
@model IEnumerable<CompoundModel>
...
@Html.EditorFor(m => m)
并按原样保留POST方法(但更改GET方法)