ASP.NET MVC提交表单后@Html.EditorFor控件值不更新问题求助
问题根因
ASP.NET MVC的HtmlHelper方法(比如@Html.EditorFor)渲染表单字段时,会优先读取ModelState中存储的POST提交原始值,而非你在控制器中修改后的Model属性值。即使你给obm.BrutoPlata赋了新值,返回视图时仍然会加载提交前的旧值,所以输入框不会更新。
解决方案
方案1:服务端提交后更新(适配现有Sacuvaj按钮提交逻辑)
- 修改控制器Post动作代码,在给Model属性赋值前清空ModelState缓存,也可以仅移除需要更新的字段缓存,性能更高:
[HttpPost] public ActionResult dodajObracun(obracunModel obm, string btn) { if(btn == "Izracunaj") { ViewBag.Message = "KLIKNUO SI IZRACUNAJ"; return View(); } try { if(ModelState.IsValid) { // 原有数据库逻辑保留 } // 新增:清空ModelState缓存,让视图优先读取修改后的Model值 // 仅需更新BrutoPlata的话可以写:ModelState.Remove("BrutoPlata"); ModelState.Clear(); decimal plata = obm.fondCasova * 183; obm.osnNetoZarada = plata; obm.netoOsnovica = 100; ViewBag.Message = plata; obm.BrutoPlata = plata; // 注意要把修改后的Model对象传给视图 return View(obm); } catch { ViewBag.Message = "Obracun nije upisan u bazu"; return View(); } }
- 修正视图中BrutoPlata字段的渲染代码,和其他字段保持结构一致,避免样式错乱:
<!-- 替换原来裸写的@Html.EditorFor(model => model.BrutoPlata) --> <div class="form-group"> @Html.LabelFor(model => model.BrutoPlata, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.BrutoPlata, new { htmlAttributes = new { @class = "form-control" } }) </div> </div>
方案2:前端实时计算(可选,无需提交服务器即可刷新结果)
如果不需要每次计算都走服务端,可以直接在视图底部加一段JS代码实现实时计算,用户体验更好:
<script> // 监听工时输入框变化自动计算 document.querySelector('input[name="fondCasova"]').addEventListener('input', function(){ const fondCasova = parseFloat(this.value) || 0; document.querySelector('input[name="BrutoPlata"]').value = (fondCasova * 183).toFixed(2); }); // 点击Izracunaj按钮触发计算 document.querySelector('input[name="izracunaj"]').addEventListener('click', function(){ const fondCasova = parseFloat(document.querySelector('input[name="fondCasova"]').value) || 0; document.querySelector('input[name="BrutoPlata"]').value = (fondCasova * 183).toFixed(2); }); </script>
内容的提问来源于stack exchange,提问作者98andrejevic
相关产品推荐
相关产品推荐

