ASP.NET MVC表单删除行后提交失效,ViewData为空问题咨询
问题原因与解决方案
核心原因
你遇到的问题本质是ASP.NET MVC模型绑定的规则限制:提交列表型数据时,模型绑定器要求表单元素的name属性必须包含连续的索引(从0开始,不能断层,比如Items[0].Name、Items[1].Name)。直接用remove()删除DOM行后,剩下的行对应的表单元素name里的索引会出现断层(比如删了第1行后,剩下Items[0].Name和Items[2].Name),模型绑定器无法识别这种不连续的索引,导致控制器接收不到任何数据,ViewData自然为空;提交后页面刷新是因为控制器没有有效数据可处理,直接返回了空视图。
另外你的JS代码存在小问题:按钮用了onclick="deleteElem(this)",但实际绑定的是$("#delete").live('click'),如果每个行都有删除按钮,多个元素用同一个id不符合HTML规范,应该改用类选择器。
能不能在页面删除后提交表单?
可以,不需要必须调用控制器方法删除前端元素,只要在删除行后修正剩下行的表单元素索引,让索引重新连续即可。
修正后的JS代码示例
// 改用类选择器绑定,避免id重复问题,兼容动态元素 $("form").on('click', ".delete-btn", function (event) { // 删除当前所在的表格行 $(this).closest("tr").remove(); // 重新排序剩下行的表单元素索引,保证连续 $("table tr").each(function(index) { // 遍历当前行内所有带索引的表单元素 $(this).find("[name*='[']").each(function() { // 替换name属性里的旧索引为新的连续索引 var newName = $(this).attr("name").replace(/\[(\d+)\]/, "[" + index + "]"); $(this).attr("name", newName); }); }); });
配套调整说明
- 将删除按钮的
id="delete"改成class="delete-btn",同时去掉按钮上的onclick="deleteElem(this)",改用JS事件绑定的方式。 - 如果使用的是较新版本的jQuery,
live()方法已被废弃,上面代码用on()的委托绑定方式更合适,能支持动态生成的元素。
内容的提问来源于stack exchange,提问作者Alex Pertenava
相关产品推荐
相关产品推荐

