You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:35:17