ASP.NET Core MVC:控制器方法间传值(表单提交后取值失败)
问题解决方案
问题原因
TempData 默认在首次读取后就会被标记为删除,而且如果你的视图中没有访问过 TempData["carid"],或者会话配置存在异常,Post 请求时就会丢失数据。而 ViewData/ViewBag 仅在单次请求内有效,Post 是全新的请求,自然无法获取到之前的值。
正确解决方法:将 ID 存入表单隐藏字段
最可靠的方式是把需要传递的 ID 放到表单的隐藏输入框中,这样提交表单时会自动将 ID 作为请求参数一起发送到 Post 方法。
步骤1:更新 ViewModel(推荐做法)
给 RecordsViewModel 添加对应属性,用于绑定传递的 ID:
public class RecordsViewModel { // 原有属性 public DateTime Date { get; set; } public string Name { get; set; } public decimal Cost { get; set; } // 新增接收ID的属性 public int? CarId { get; set; } }
步骤2:修改 HttpGet 的 Create 方法
初始化 ViewModel 并赋值 ID,传递给视图:
[HttpGet] public IActionResult Create(int? id) { Debug.WriteLine(id); var viewModel = new RecordsViewModel { CarId = id }; return View(viewModel); }
步骤3:在视图中添加隐藏字段
在表单里加入绑定 CarId 的隐藏输入框(以 Razor 视图为例):
@model RecordsViewModel <form method="post"> <!-- 原有表单字段 --> <div> <label asp-for="Date"></label> <input asp-for="Date" /> </div> <div> <label asp-for="Name"></label> <input asp-for="Name" /> </div> <div> <label asp-for="Cost"></label> <input asp-for="Cost" /> </div> <!-- 隐藏字段,传递CarId --> <input type="hidden" asp-for="CarId" /> <button type="submit">提交</button> </form>
步骤4:修改 HttpPost 的 Create 方法
直接从 ViewModel 中获取 ID:
[HttpPost] public async Task<IActionResult> Create(RecordsViewModel addRecord) { var carId = addRecord.CarId; Debug.WriteLine(carId); var record = new Records() { ID = carId, Date = addRecord.Date, Name = addRecord.Name, Cost = addRecord.Cost, }; await carRep.Records.AddAsync(record); await carRep.SaveChangesAsync(); // 如果需要跳转后仍保留ID,可添加参数:return RedirectToAction("Create", new { id = carId }); return RedirectToAction("Create"); }
备选方案(不修改 ViewModel)
如果不想改动 ViewModel,也可以直接在视图中手动添加隐藏字段:
<input type="hidden" name="CarId" value="@ViewBag.CarId" />
同时在 HttpGet 方法中将 ID 存入 ViewBag:
[HttpGet] public IActionResult Create(int? id) { Debug.WriteLine(id); ViewBag.CarId = id; return View(); }
然后在 Post 方法中通过 Request.Form["CarId"] 获取值(注意类型转换):
var carId = int.TryParse(Request.Form["CarId"], out var id) ? id : (int?)null;
内容的提问来源于stack exchange,提问作者ddr35
相关产品推荐
相关产品推荐

