粘贴输入时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
相关产品推荐
相关产品推荐

