.NET MVC列表传至视图后长度正确但字段为空的问题求助
解决.NET MVC视图中列表字段为空的问题
兄弟,我之前也踩过这个坑!问题根源在于MVC的模型绑定需要带索引的集合来追踪每个元素,你用foreach遍历的方式生成的input元素,没办法和后台模型正确关联,所以才会出现循环次数对但所有字段为空的情况。下面给你两种靠谱的解决方案:
方案一:用for循环替代foreach
MVC的EditorFor需要通过集合索引来生成正确的name属性(比如personList[0].Name),这样才能正确绑定到模型的每个项。注意你的personList必须是实现IList<T>的集合(比如List<Person>),不能是IEnumerable<T>(因为它没有索引器)。
修改后的视图代码:
@model myProject.TwoModels @using (Html.BeginForm("Edit", "Home", FormMethod.Post)) { @for (int i = 0; i < Model.personList.Count; i++) { @Html.EditorFor(model => model.personList[i].Name) } }
方案二:使用编辑器模板(更优雅的方式)
如果你的列表需要重复渲染复杂的模型项,编辑器模板是更好的选择,代码更简洁也更易维护:
- 首先在
Views/Shared/EditorTemplates文件夹下创建一个名为Person.cshtml的视图(名字要和模型类名一致),内容如下:
@model myProject.Person @Html.EditorFor(model => model.Name)
- 然后在主视图里直接渲染整个集合:
@model myProject.TwoModels @using (Html.BeginForm("Edit", "Home", FormMethod.Post)) { @Html.EditorFor(model => model.personList) }
MVC会自动遍历你的personList,为每个Person实例应用模板,同时自动生成带索引的name属性,不管是显示数据还是提交后的模型绑定都能正常工作。
为什么原来的foreach不行?
当你用foreach遍历的时候,tuple是一个局部变量,EditorFor生成的input元素name属性会是tuple.Name,而不是MVC模型绑定器能识别的personList[0].Name、personList[1].Name这类格式。这样一来,视图既没法从模型中正确读取字段值,提交后后台也没法把表单值映射回你的集合,自然就出现了空字段的情况。
内容的提问来源于stack exchange,提问作者programmer
相关产品推荐
相关产品推荐

