ASP.NET Form编辑时保留非编辑字段原值的技术问询
解决方案
给你几个实用的处理方案,按推荐程度排序:
1. 用专用的编辑视图模型(最推荐)
直接创建一个只包含允许修改字段的视图模型,提交时只接收这三个字段,再和数据库里的原实体合并后保存,从根源避免其他字段被覆盖:
// 编辑专用视图模型 public class RequestEditViewModel { public int Id { get; set; } // 用于定位原数据 public decimal? ActualHours { get; set; } public bool Completed { get; set; } public string RiseDescription { get; set; } } // Controller里的Post方法 [HttpPost] public async Task<IActionResult> Edit(RequestEditViewModel model) { if (!ModelState.IsValid) { return View(model); } // 从数据库获取原实体 var originalRequest = await _dbContext.Requests.FindAsync(model.Id); if (originalRequest == null) { return NotFound(); } // 只更新允许修改的字段 originalRequest.ActualHours = model.ActualHours; originalRequest.Completed = model.Completed; originalRequest.RiseDescription = model.RiseDescription; // 保存变更 await _dbContext.SaveChangesAsync(); return RedirectToAction(nameof(Details), new { id = model.Id }); }
这种方法清晰安全,避免了不必要的字段暴露,也不会出现字段被重置的问题。
2. 用TryUpdateModel做部分字段绑定(无需新建模型)
如果不想额外建视图模型,可以用框架自带的TryUpdateModelAsync方法,指定只绑定允许修改的字段,其他字段保留数据库原有值:
[HttpPost] public async Task<IActionResult> Edit(int id) { var originalRequest = await _dbContext.Requests.FindAsync(id); if (originalRequest == null) { return NotFound(); } // 只更新指定的三个字段 if (await TryUpdateModelAsync(originalRequest, "", r => r.ActualHours, r => r.Completed, r => r.RiseDescription)) { await _dbContext.SaveChangesAsync(); return RedirectToAction(nameof(Details), new { id }); } return View(originalRequest); }
注意这里不要直接把Request模型作为方法参数,而是先从数据库取原数据,再选择性绑定提交的字段。
3. 排查隐藏域失效的问题(不推荐,仅作参考)
你之前用隐藏域失败,大概率是字段名称不匹配或者遗漏了必要字段。比如要保留的字段必须在表单里添加对应的隐藏域,且name属性要和模型属性完全一致:
<!-- 示例:保留Id字段的隐藏域 --> <input type="hidden" name="Id" value="@Model.Id" /> <!-- 或者用Html辅助类 --> @Html.HiddenFor(m => m.Id)
但这种方法在字段多的时候很繁琐,还容易因为字段变更漏加隐藏域,导致数据丢失,所以不推荐长期用。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

