ASP.NET中jQuery弹窗文本框提交后后端仅读取首次输入值问题
核心问题定位
之前实现里读不到最新值的根本原因是DOM中存在多个同名称的表单字段,服务端读取时默认匹配到了首次生成的残留字段:
- 每次点击弹窗的确认/取消按钮时,代码都会新建一个
name="discount_end"的隐藏域并追加到表单里 - 第一次操作生成的隐藏域会一直留在DOM中,后续操作新增的同名隐藏域不会覆盖它
- 按照WebForm的表单提交规则,同名称字段存在多个时,
Request.Form默认返回序列里的第一个值,也就是你第一次输入后生成的旧值,后续输入的新值哪怕赋值给了新的隐藏域,也不会被服务端读到
修复方案
调整前端JS逻辑,从源头上避免重复字段
- 弹窗触发时,先把所有已存在的
name="discount_end"隐藏域全部从DOM中删除,彻底清掉历史残留 - 只创建一次目标隐藏域,提前追加到表单中,后续所有操作只更新这个隐藏域的value,不再重复新建
- 提交回发前,同步把弹窗文本框的最新输入值赋值给这个固定的隐藏域,再触发回发
修改后的完整JS代码:
function DiscountAtLast(chk) { // 清理所有历史残留的同名称隐藏域,杜绝多值干扰 const oldHiddenInputs = document.forms[0].querySelectorAll('input[name="discount_end"]'); oldHiddenInputs.forEach(el => el.remove()); // 仅创建一次隐藏域,后续不重复生成 const discount_end = document.createElement("INPUT"); discount_end.type = "hidden"; discount_end.name = "discount_end"; document.forms[0].appendChild(discount_end); if (chk.checked) { $("#popupdiv").dialog({ title: "Login Info", resizable: false, height: "auto", width: 400, modal: true, // 开启模态,避免弹窗未关闭时用户操作页面造成值不同步 buttons: { Cancel: function () { // 同步当前输入值到隐藏域 discount_end.value = $("[id*=pass]").val(); $(this).dialog("close"); return false; }, Ok: function () { // 提交前同步最新输入值 discount_end.value = $("[id*='pass']").val(); $(this).dialog("close"); // 确认值同步完成后再触发回发 __doPostBack('<%=btnDiscountAtEnd.UniqueID%>', ""); return true; } } }); } }
服务端代码无需调整
只要保证表单内仅存在一个name="discount_end"的字段,且每次提交前同步为弹窗的最新输入值,原有的Request.Form["discount_end"]逻辑就会正确读取当次的用户输入,不会再返回首次的旧值。
补充说明:因为带
runat="server"的ASP.NET TextBox会通过ViewState持久化旧值,如果你后续尝试直接读服务端TextBox的Text属性拿值,会受ViewState的缓存影响,不如用固定隐藏域传值的方式稳定可靠。
内容的提问来源于stack exchange,提问作者shakeel ahmad
相关产品推荐
相关产品推荐

