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

如何在多个Action与View间传递Model参数并维持其状态?

如何在多个Action和View间维持Model状态,避免参数丢失?

我怀疑自己在Model绑定上犯了基础错误,想请教怎么在多个Action和View之间维持Model的状态,确保参数值不会丢失。


示例代码

1. 定义Model

public class Car : IDisposable
{
    // 其他代码
    public string Brand { get; set; }
    public string Color { get; set; }
    public int Capacity { get; set; }
}

2. 在第一个Action中创建实例

[HttpPost]
public IActionResult Test_car_1st(int x)
{
    var mycar = new Car();
    mycar.Brand = "Honda";
    // 其他代码
    return View("TestView", mycar);
}

3. 在TestView中让用户编辑Model的Color属性

@model Car;
<!-- 其他代码 -->

<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="Test_car_2nd" asp-route-Model="@Model" >
    <!-- 用户从下拉框选择颜色 -->
    <select asp-for="@Model.Color">
        <option value="">
        <!-- 其他选项代码 -->
    </select>
    <input type="submit" value="Submit" class="btn btn-primary" asp-controller="Home" asp-action="Test_car_2nd"/>
</form>

4. 第二个Action接收Model

public IActionResult Test_car_2nd(Car Model)
{
    // 其他代码
    return View("TestView_2", Model);
}

问题现象

我原本期望Test_car_2nd Action里能拿到已设置的两个参数,但实际只有Color有值,Brand是null。

目前遇到的规律:

  • 在Action中修改参数后调用View,Model的值会保留。
  • 在View中编辑值后调用Action,只有View中修改/创建的参数会被保留,之前设置的其他参数会丢失(显示为null)。

接受解决方案后的补充总结

Session对象是目前最适合我的解决方案。下面为可能遇到同样问题的人总结各种方法的优缺点,以及我之前犯的错误:

  1. 核心认知错误:HTTP是无状态的。我之前困惑的点在于调试时能在View渲染前看到Model参数,但忽略了View渲染完成后就无法再访问这些参数了,这是个基础但容易忽略的点!

  2. 状态传递的可选方法:

    • 选项1:隐藏输入框(Hidden input type):大多数场景下好用,但如果Model包含列表,实现起来会麻烦一些,但完全可行。其实在提问前我一直在用这种方法。
    • 选项2:Session对象:如果Model属性复杂,这是更好的选择,代码可维护性更高,也是我最终采纳的方案。
  3. 关于内存占用的疑问:目前来看上述两种方法的内存占用差异不大。我现在用HttpContext.Session.Remove("ObjectName")来释放Session占用的内存,想请教这是不是最有效的方式?有没有更好的优化建议?


内容的提问来源于stack exchange,提问作者somnath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:32