You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
        });
    });
});

配套调整说明

  1. 将删除按钮的id="delete"改成class="delete-btn",同时去掉按钮上的onclick="deleteElem(this)",改用JS事件绑定的方式。
  2. 如果使用的是较新版本的jQuery,live()方法已被废弃,上面代码用on()的委托绑定方式更合适,能支持动态生成的元素。

内容的提问来源于stack exchange,提问作者Alex Pertenava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:42:53