问题:删除数据时明明已删除再重新调用方法以刷新数据,无故导致 405,请懂的人不会再写前后端代码
咏方舟-长流支流 2026-07-18
由于报表在移动端时不宜显示太多字段,于是将主要字段显示,其它字段以展开发的方式显示,点击删除,正常结果是删除后,刷新数据,然后单步查看数据是删除了,但是出现了405。
在移植报表的时候,碰到这个问题,调试了很久,后来才想起来我的折叠行是子元素,因为我封装了以后其实是前端、后端再也一行代码也不用写的,现在是把报表加上CRUD以便于不用代码生成器,直接配置就事大吉。
请读完,一定会有收获。如果你仔细看了图文并想明白里面的编程思想,相信你以后不用再写一行前端代码、也不用再写一行后端代码,。
现象
点击展开行中的“删除”按钮(为了方便调试我把主键ID值都显示到按钮旁边),页面出现 405 错误,我特意在刷新函数时写个alert(‘删除成功’)也没弹出来。
原因
子元素应用了单击事件,展开行也用了单击事件,所以点删除后,事件向上冒泡,引发了父元素的单击事件,所以根本到不了刷新函数。
解决方案
去掉冒泡:
sb.AppendLine("function doEdit(element) {");sb.AppendLine(" var evt = window.event || event;");sb.AppendLine(" if (evt) {");sb.AppendLine(" evt.preventDefault();");sb.AppendLine(" evt.stopPropagation();");sb.AppendLine(" }");sb.AppendLine(" var id = $(element).siblings('.row-id').text().trim();");sb.AppendLine(" if (!id) {");//...经验总结
1、配置的时候,注意用布局自动渲染模板里的doEdit(this),并在边上加一个隐藏的span以便于doEdit读取ID值,这是编程技巧,但是挡不住现在把ORM的增删改直接接进去,敲了一天代码头都蒙了一时没转过弯。
2、父元素有onclick="webmisGrid.doFoldExpandView(this,true)",点击“删除”按钮时事件冒泡到父元素,触发了展开/折叠逻辑,导致页面刷新或额外请求。
3、删除按钮的点击事件没有阻止冒泡,doDelete内部的return false不能阻止事件传播。
3. 解决方案:在doDelete内部用event.stopPropagation()阻止冒泡,或直接在模板按钮上加onclick="event.stopPropagation(); doDelete(this);",确保点击子元素时父元素事件不被触发。