相同TargetControlID触发时ModalPopupExtender显示后无法隐藏问题求解
问题根因
你当前将ModalPopupExtender的TargetControlID直接绑定到了RadListBox控件,只要点击列表项就会自动触发模态框弹出。但重复选中同一项时,SelectedIndexChanged事件不会触发,后端加载逻辑没有执行,自然也没有触发模态框隐藏的逻辑,就会出现模态框常驻的问题。
解决方案
1. 前端代码调整
首先新增一个隐藏的虚拟按钮作为模态框的触发目标,避免点击列表项就自动弹框:
<asp:Button ID="btnDummy" runat="server" style="display:none;" />
修改ModalPopupExtender的属性,更换触发目标、修改BehaviorID避免和列表控件ID冲突:
<ajaxToolKit:ModalPopupExtender ID="mpeProgress" runat="server" TargetControlID="btnDummy" PopupDragHandleControlID="pnlProgress" X="1000" Y="500" PopupControlID="pnlProgress" BackgroundCssClass="modalBackground" RepositionMode="RepositionOnWindowResize" BehaviorID="mpeProgressBehavior"> </ajaxToolKit:ModalPopupExtender>
新增客户端校验逻辑,判断选中项是否和上一次一致,仅当值变化时才弹出模态框:
// 全局变量存储上一次选中的值 var lastSelectedValue = null; function OnClientSelectedIndexChanging(sender, args) { var currentValue = args.get_item().get_value(); // 选中值未变化,取消回发、不弹框 if(currentValue === lastSelectedValue) { args.set_cancel(true); return; } // 选中值变化,更新存储值、手动弹出模态框 lastSelectedValue = currentValue; $find('mpeProgressBehavior').show(); }
给你的RadListBox绑定上述客户端事件:
<telerik:RadListBox ID="lboxTestedMachines" runat="server" OnClientSelectedIndexChanging="OnClientSelectedIndexChanging" AutoPostBack="true" <!-- 其他原有属性 --> >
2. 后端代码调整
在SelectedIndexChanged事件的所有逻辑执行完成后,注册脚本主动隐藏模态框:
protected void lboxTestedMachines_SelectedIndexChanged(object sender, EventArgs e) { int iResultID = Convert.ToInt32(lboxTestedMachines.SelectedValue); if (tbl_charts.Style.Value != "display:normal") tbl_charts.Style.Value = "display:normal"; GetMachineName(iResultID); RdListView_Chart.DataSource = LoadCassetteForFoodChart(iResultID); RdListView_Chart.DataBind();// 若原有代码已写绑定逻辑可删除此行 GetApprovalRejectionStatus(iResultID); // 新增:执行完所有逻辑后隐藏模态框 ScriptManager.RegisterStartupScript(this, this.GetType(), "hideMpe", "$find('mpeProgressBehavior').hide();", true); }
内容的提问来源于stack exchange,提问作者TReiser
相关产品推荐
相关产品推荐

