MVC Core 2.0客户端多表单创建后服务端数据获取方案咨询
这个问题我之前帮不少开发者梳理过,核心原因是ASP.NET MVC的模型绑定机制对表单字段的命名有特定规则,你动态生成的表单字段没有遵循这个规则,所以后端无法将它们映射到模型集合里。下面给你几个关键解决方向:
先搞懂模型绑定的命名规则:对于集合类型的模型(比如
List<Student>),MVC要求表单字段的name属性格式必须是[索引].属性名,比如Students[0].Name、Students[1].Address。@Html.TextBoxFor会自动为你生成符合这个格式的name属性,但你手动用JS生成的字段大概率没遵循这个命名规范,导致后端绑定失败。预先初始化足够数量的模型实例:既然你最多允许添加6个学生,可以在后端Action对应的ViewModel里初始化一个包含6个空
Student对象的集合。前端先把这些表单都渲染出来(可以默认隐藏多余的),然后根据“学生数量”下拉框的选择,显示对应数量的表单。这种方式下所有字段都是@Html.TextBoxFor生成的,天然符合绑定规则,不需要手动处理命名。动态生成字段时严格遵循命名格式:如果坚持用JS动态生成新表单,那么在创建每个字段的name属性时,必须按照
Students[i].属性名的格式来(i从0开始,依次递增)。你可以参考第一个自动生成的字段的name属性格式,确保后续生成的字段只是索引值不同,其他部分完全一致。利用EditorTemplates简化渲染:你可以为
Student模型创建一个EditorTemplate,然后在页面中用@Html.EditorFor(m => m.Students)来渲染整个集合。这样生成的每个学生表单都会自动符合模型绑定的命名规则,动态添加时只需克隆已有的表单DOM,修改其中的索引值即可,比手动拼接HTML更可靠。验证字段命名是否正确:动态生成表单后,打开浏览器的开发者工具(F12)查看表单字段的name属性,确认它们和第一个自动生成的字段格式一致。如果name格式不对,后端肯定无法获取到对应数据。
内容的提问来源于stack exchange,提问作者ElaineElaine

