如何在多个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对象是目前最适合我的解决方案。下面为可能遇到同样问题的人总结各种方法的优缺点,以及我之前犯的错误:
核心认知错误:HTTP是无状态的。我之前困惑的点在于调试时能在View渲染前看到Model参数,但忽略了View渲染完成后就无法再访问这些参数了,这是个基础但容易忽略的点!
状态传递的可选方法:
- 选项1:隐藏输入框(Hidden input type):大多数场景下好用,但如果Model包含列表,实现起来会麻烦一些,但完全可行。其实在提问前我一直在用这种方法。
- 选项2:Session对象:如果Model属性复杂,这是更好的选择,代码可维护性更高,也是我最终采纳的方案。
关于内存占用的疑问:目前来看上述两种方法的内存占用差异不大。我现在用
HttpContext.Session.Remove("ObjectName")来释放Session占用的内存,想请教这是不是最有效的方式?有没有更好的优化建议?
内容的提问来源于stack exchange,提问作者somnath
相关产品推荐
相关产品推荐

