使用bootbox.confirm实现GridView删除时始终返回false的问题
嘿,这个问题我之前做ASP.NET项目时也踩过一模一样的坑!核心问题出在bootbox.confirm是异步执行的,和ASP.NET服务器控件的同步提交逻辑不兼容,我来给你一步步拆解解决方案:
先说说你遇到的问题根源
你写的初始JS代码里,调用bootbox.confirm之后,代码不会等用户点击确认就直接往下跑,执行return false——这就是为啥先弹出alert('outside'),之后才看到确认框;要是把return false移去else分支,服务器端提交会直接触发,根本等不到用户确认。
可行的解决思路
我们可以给LinkButton加个自定义属性标记用户是否确认,确认后再手动触发按钮提交,具体实现如下:
1. GridView布局不用改
你的GridView代码完全没问题,LinkButton的OnClientClick还是绑定OpenDeleteBox(this)就行:
<asp:GridView ID="gvEntRelationship" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="OFTID" DataSourceID="ObjectDataEntRelations" EnableModelValidation="True" > <Columns> <asp:CommandField ShowEditButton="True" /> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="lnkDelRel" runat="server" CausesValidation="False" CommandName="Del" Text="Delete" OnClientClick="return OpenDeleteBox(this);"></asp:LinkButton> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
2. 替换成这个JS函数
function OpenDeleteBox(sender) { // 先检查是否已经确认过,确认过就放行提交 if ($(sender).attr("confirmed") == "true") { return true; } // 弹出bootbox确认框 bootbox.confirm("Delete This?", function (confirmed) { if (confirmed) { // 给按钮打个已确认的标记 $(sender).attr("confirmed", confirmed); // 手动触发按钮点击,这次会走上面的放行分支 sender.click(); } }); // 第一次点击直接返回false,阻止默认提交 return false; }
为啥这个能行?
我给你捋一遍流程:
- 第一次点删除按钮:函数发现按钮没有
confirmed标记,弹出确认框,然后立刻return false,把默认的服务器提交拦下来。 - 用户点确认:我们给按钮加个
confirmed="true"的属性,再手动点一下这个按钮。 - 第二次进函数:检测到
confirmed是true,直接return true,允许按钮提交到后端,触发GridView的RowCommand事件。
这样既保证了用户能看到确认框做选择,又能正确触发后端的删除逻辑,完美解决冲突~
内容的提问来源于stack exchange,提问作者Addy
相关产品推荐
相关产品推荐

