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

粘贴输入时ASP.NET TextBox控件的TextChanged回发事件未触发问题排查

ASP.NET TextBox TextChanged Not Firing on Paste (Works on Manual Input)

我之前碰到过完全一样的问题,核心原因是你的自定义verificaIncolla函数直接修改了TextBox的value属性,但没有触发控件的change事件——ASP.NET的客户端回发机制依赖这个事件来标记控件值已变更,进而触发TextChanged的回发逻辑。

解决方案:手动触发change事件

在verificaIncolla函数的try块末尾(catch之前),添加一段代码手动触发控件的change事件,让ASP.NET检测到值的变化:

// 触发change事件,通知ASP.NET控件值已修改
if (typeof Event === 'function') {
  const changeEvent = new Event('change');
  sender.dispatchEvent(changeEvent);
} else {
  // 兼容旧版IE浏览器
  sender.fireEvent('onchange');
}

修改后的完整verificaIncolla函数

verificaIncolla(event, sender) { 
  try { 
    var clipboardData = (event.clipboardData || window.clipboardData); 
    var pasted = clipboardData ? clipboardData.getData('text') : null; 
    if (!pasted) { 
      return; 
    } 
    var containsLetter = /[A-Za-zÀ-ɏ]/.test(pasted); 
    if (containsLetter) { 
      return; 
    } 
    var cleaned = pasted.replace(/\s+/g, ''); 
    cleaned = cleaned.replace(/[^0-9\.,\-]/g, ''); 
    cleaned = cleaned.replace(/-/g, function (m, offset) { 
      return (offset === 0) ? '-' : ''; 
    }); 
    if (cleaned.indexOf('-') > 0) { 
      cleaned = cleaned.replace(/-/g, ''); 
    } 
    var separators = cleaned.match(/[.,]/g); 
    if (separators && separators.length > 1) { 
      var lastSep = cleaned.lastIndexOf('.') > cleaned.lastIndexOf(',') ? '.' : ','; 
      cleaned = cleaned.replace(/[.,]/g, ''); 
      if (cleaned.length > 2) { 
        var before = cleaned.substring(0, cleaned.length - 2); 
        var after = cleaned.substring(cleaned.length - 2); 
        cleaned = before + lastSep + after; 
      } else { 
        cleaned = cleaned + lastSep; 
      } 
    } 
    var start = sender.selectionStart; 
    var end = sender.selectionEnd; 
    var value = sender.value || ""; 
    var newValue = value.substring(0, start) + cleaned + value.substring(end); 
    sender.value = newValue; 
    var newCaret = start + cleaned.length; 
    if (typeof sender.setSelectionRange === 'function') { 
      sender.setSelectionRange(newCaret, newCaret); 
    } 
    replaceAllDot(sender); 
    VerificaTestoImporto(sender); 
    if (typeof formattaNumero === 'function') { 
      try { 
        formattaNumero(sender,2); 
      } catch (e) { } 
    }

    // 新增:触发change事件,让ASP.NET感知到值的变化
    if (typeof Event === 'function') {
      const changeEvent = new Event('change');
      sender.dispatchEvent(changeEvent);
    } else {
      sender.fireEvent('onchange');
    }
  } catch (e) { 
    console.error('verificaIncolla error:', e); 
  } 
}

为什么移除onpaste就正常?

当你移除自定义的onpaste绑定后,浏览器会执行默认的粘贴行为,粘贴完成后会自动触发TextBox的change事件,ASP.NET的客户端脚本会捕捉到这个事件,标记控件为已修改,从而触发TextChanged回发。而你的自定义函数直接修改了value但没有触发这个关键的change事件,导致ASP.NET不知道值已经发生了变化。

额外确认

确保你的TextBox控件已经设置了AutoPostBack="true"(你手动输入能正常触发回发,应该已经设置了,但可以再核对下):

<asp:TextBox CssClass="form-control" OnTextChanged="txtDecimale_TextChanged" runat="server" ID="txtDecimale" AutoPostBack="true" onkeyup="VerificaTestoImporto(this)" onfocus="replaceAllDot(this);" onpaste="verificaIncolla(event,this)" ></asp:TextBox>

内容的提问来源于stack exchange,提问作者Gianlu23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 06:39:26