ASP.NET C# UpdatePanel TextChanged事件触发后焦点丢失及按钮点击失效问题
问题原因
- 异步局部刷新后焦点丢失:UpdatePanel触发异步回发刷新DOM后,浏览器默认不会保留或自动跳转焦点,你修改了
txtTahsilEdilen的文本内容,对应控件的交互状态会被刷新重置,自然不会自动聚焦。 - 冗余嵌套UpdatePanel导致状态异常:你嵌套了两层UpdatePanel,
txtTutar的TextChanged事件同时触发外层UpdatePanel1和内层UpdatePanel2的刷新,多节点同步刷新容易出现交互状态冲突,极端情况下会出现请求队列阻塞,导致点击按钮无响应。 - 缺少输入合法性校验:你后端代码直接用
decimal.Parse转换用户输入的文本,一旦输入内容不是合法数字会直接抛出异常,中断后续逻辑执行,也会表现为按钮点击无响应、交互失效。
修复方案
第一步:优化前端UpdatePanel结构,移除不必要的嵌套
修改default.aspx代码,去掉内层冗余的UpdatePanel2:
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server"> <ContentTemplate> <div class="form-group row"> <label class="col-lg-2 col-form-label">交易金额</label> <div class="col-lg-4"> <asp:TextBox ID="txtTutar" CssClass="form-control form-control-sm price" AutoPostBack="true" placeholder="0,00 ₺" runat="server" OnTextChanged="txtTutar_TextChanged"></asp:TextBox> </div> </div> <div class="form-group row"> <label class="col-lg-2 col-form-label">已收金额</label> <div class="col-lg-4"> <asp:TextBox ID="txtTahsilEdilen" AutoPostBack="true" CssClass="money form-control form-control-sm price" placeholder="0,00 ₺" runat="server" OnTextChanged="txtTahsilEdilen_TextChanged"></asp:TextBox> </div> </div> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="txtTutar" EventName="TextChanged" /> </Triggers> </asp:UpdatePanel>
第二步:修改后端事件逻辑,增加校验+主动设置焦点
修改default.aspx.cs的txtTutar_TextChanged方法,增加输入校验,异步回发后主动把焦点设置到下一个控件:
protected void txtTutar_TextChanged(object sender, EventArgs e) { // 先校验输入合法性,避免转换报错 if (decimal.TryParse(txtTutar.Text, out decimal tutar)) { txtTutar.Text = FormatMoney(tutar); txtTahsilEdilen.Text = txtTutar.Text; // 异步回发场景下要用ScriptManager.SetFocus设置焦点,不要用Page.SetFocus ScriptManager.GetCurrent(this).SetFocus(txtTahsilEdilen); } else { // 输入不合法的情况下重置文本,焦点留在当前输入框 txtTutar.Text = "0,00 ₺"; ScriptManager.GetCurrent(this).SetFocus(txtTutar); } }
可选优化(推荐)
如果你的金额格式化逻辑不需要依赖服务端数据,可以直接用前端JS实现金额格式化,关闭TextBox的AutoPostBack,完全避免异步回发导致的焦点丢失、卡顿问题,交互体验会好很多。
内容的提问来源于stack exchange,提问作者Mehmet Akif
相关产品推荐
相关产品推荐

