ASP.NET运行时标签lblassest返回0值问题排查求助
问题根因
- 服务端无法读取客户端修改的Label值:
<asp:Label>控件在前端会渲染为普通的span标签,不属于表单提交字段。你通过JS修改的只是浏览器端的DOM内容,页面回发时这个值不会被提交到服务端,服务端读取的lblcurrentbtc.Text实际是页面首次渲染时的初始值(绝大多数情况是空值),decimal.TryParse解析空值失败后会给price赋值为默认的0,最终相乘结果自然是0。 - 代码冗余隐患:C#代码中二次读取
reader["WallBalan"]没有做空判断,虽然你前面已经给pr_charges做了DBNull处理,但重复读取数据源可能引发不必要的异常。 - JS代码存在拼写错误:
if (coinsData.lenght > 0)中length拼写错误,如果你是刚测试阶段还可能因为这个问题导致lblcurrentbtc赋值失败,不过你已经确认有有效值的话这个问题应该已经修复。
修复方案
- 新增隐藏域同步需要回传的价格:在前端ASP代码中添加隐藏域控件
<asp:HiddenField ID="hfBtcPrice" runat="server" />
- 修改JS赋值逻辑,给Label赋值的同时给隐藏域赋值:
// 原有给lblcurrentbtc赋值的逻辑保留,新增下面一行 document.getElementById('<%= hfBtcPrice.ClientID %>').value = objCells.item(5).innerHTML;
- 调整C#读取逻辑,改为从隐藏域取值,同时复用已经处理好的
pr_charges计算:
if (reader.Read()) { decimal price; // 从隐藏域读取价格,不要读Label的Text decimal.TryParse(hfBtcPrice.Value, out price); decimal pr_charges = reader["WallBalan"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["WallBalan"]); lblamount.Text = pr_charges.ToString(); // 直接用已经处理过的pr_charges计算,不要重复读reader lblassest.Text = (pr_charges * price).ToString(); reader.Close(); }
如果不需要在服务端做其他逻辑处理,也可以直接在JS中计算好资产值直接给lblassest赋值,不需要走页面回发流程,性能更好。
内容的提问来源于stack exchange,提问作者Black
相关产品推荐
相关产品推荐

