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

ASP.NET C# UpdatePanel TextChanged事件触发后焦点丢失及按钮点击失效问题

问题原因

  1. 异步局部刷新后焦点丢失:UpdatePanel触发异步回发刷新DOM后,浏览器默认不会保留或自动跳转焦点,你修改了txtTahsilEdilen的文本内容,对应控件的交互状态会被刷新重置,自然不会自动聚焦。
  2. 冗余嵌套UpdatePanel导致状态异常:你嵌套了两层UpdatePanel,txtTutar的TextChanged事件同时触发外层UpdatePanel1和内层UpdatePanel2的刷新,多节点同步刷新容易出现交互状态冲突,极端情况下会出现请求队列阻塞,导致点击按钮无响应。
  3. 缺少输入合法性校验:你后端代码直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:24:02