ASP.NET中用jQuery修改Button文本后后台无法获取文本的问题
问题分析与解决方案
你遇到的核心问题是:ASP.NET服务器控件的Text属性依赖ViewState维护,前端通过jQuery修改的是按钮的HTML value属性,并不会同步到后台服务器端的Text属性,所以后台判断btnAddShip.Text时永远拿不到你前端设置的"הוסף"或"עדכן"。
下面给你几个无需新增按钮就能实现需求的可行方案:
方案1:使用隐藏域存储操作类型(最直接)
步骤1:在页面添加一个隐藏域
<asp:HiddenField ID="hdnOperationType" runat="server" Value="Add" />
步骤2:修改前端jQuery代码,更新隐藏域的值
$(document).ready(function () { $("#spanOpen").click(function () { $("#fulldiv").fadeIn(1000); $('#titleModal').text('הוספת שלוחה'); $("#ContentPlaceHolder1_btnAddShip").prop('value', 'הוסף'); // 新增:标记当前为添加操作 $('#ContentPlaceHolder1_hdnOperationType').val('Add'); // 原有清空表单代码保持不变 $('#ContentPlaceHolder1_txtShipName').val(''); $('#ContentPlaceHolder1_txtShipPrice').val(''); $('#ContentPlaceHolder1_txtShipStart').val(''); $('#ContentPlaceHolder1_txtShipEnd').val(''); $('#ContentPlaceHolder1_txtShipPremium').val('No'); }); $(" .close").click(function () { $("#fulldiv").fadeOut(500); }); }); function UpdateClick(btn) { $("#fulldiv").fadeIn(1000); var row = btn.parentNode.parentNode; var rowIndex = row.rowIndex - 1; // 原有表单赋值代码保持不变 $('#ContentPlaceHolder1_txtShipName').val(row.cells[6].innerHTML); $('#ContentPlaceHolder1_txtShipPrice').val(row.cells[5].innerHTML); $('#ContentPlaceHolder1_txtShipStart').val(row.cells[4].innerHTML); $('#ContentPlaceHolder1_txtShipEnd').val(row.cells[3].innerHTML); $('#ContentPlaceHolder1_txtShipPremium').val(row.cells[2].innerHTML); $('#titleModal').text('עדכן שלוחה'); $("#ContentPlaceHolder1_btnAddShip").prop('value', 'עדכן'); // 新增:标记当前为更新操作 $('#ContentPlaceHolder1_hdnOperationType').val('Update'); return false; }
步骤3:修改后台C#代码,读取隐藏域的值判断操作
ElectricWSL.Ship ship = new ElectricWSL.Ship(); ship.ShipName = txtShipName.Text.Trim(); ship.ShipPremium = txtShipPremium.Text.Trim(); ship.ShipPrice = double.Parse(txtShipPrice.Text); ship.ShipStartTime = txtShipStart.Text.Trim(); ship.ShipEndTime = txtShipEnd.Text.Trim(); // 根据隐藏域的值判断执行添加还是更新 if (hdnOperationType.Value == "Add") { ws.WSLAddShip(ship); ShowXMLGrid(); } else { int rowIndex = GetRow(txtShipName.Text); ws.WSLUpdateShip(ship, rowIndex); ShowXMLGrid(); }
方案2:利用按钮的CommandArgument属性
步骤1:修改前端jQuery代码,更新按钮的CommandArgument
打开添加模态框时:
$("#ContentPlaceHolder1_btnAddShip").prop('value', 'הוסף').attr('commandargument', 'Add');
打开更新模态框时:
$("#ContentPlaceHolder1_btnAddShip").prop('value', 'עדכן').attr('commandargument', 'Update');
步骤2:后台读取CommandArgument判断操作
ElectricWSL.Ship ship = new ElectricWSL.Ship(); ship.ShipName = txtShipName.Text.Trim(); ship.ShipPremium = txtShipPremium.Text.Trim(); ship.ShipPrice = double.Parse(txtShipPrice.Text); ship.ShipStartTime = txtShipStart.Text.Trim(); ship.ShipEndTime = txtShipEnd.Text.Trim(); if (btnAddShip.CommandArgument == "Add") { ws.WSLAddShip(ship); ShowXMLGrid(); } else { int rowIndex = GetRow(txtShipName.Text); ws.WSLUpdateShip(ship, rowIndex); ShowXMLGrid(); }
补充:为什么原有方法无效?
ASP.NET服务器控件的Text属性是在服务器端渲染的,生成的HTML按钮value只是前端表现。表单提交时,ASP.NET会通过ViewState还原服务器控件的属性,前端修改的value不会自动回发到服务器的Text属性中,因此无法通过按钮文本判断后台操作,必须用隐藏域或其他可回发的标识来实现。
内容的提问来源于stack exchange,提问作者David Izhaki
相关产品推荐
相关产品推荐

