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

为何BeginForm无法将CartOrderViewModel传递给POST控制器方法?

问题原因与解决方案

问题根源

你的CartOrderViewModel中定义的都是字段(field),而ASP.NET Core的模型绑定系统仅默认支持绑定属性(property)(带有get/set访问器的成员)。由于字段无法被模型绑定器识别,导致POST请求时无法正确映射参数,最终CartOrderViewModel实例为null。

解决步骤

1. 将ViewModel的字段改为属性

修改CartOrderViewModel的定义,把所有字段替换为带访问器的属性:

public class CartOrderViewModel
{
    public Cart Carts { get; set; }
    public Order Orders { get; set; }
    public string name { get; set; }
}

2. 按需传递额外数据(可选)

如果需要在POST后保留Carts和Orders中的部分数据,需要在视图中通过隐藏域(HiddenFor)提交这些数据——因为表单默认只会提交可见控件的内容,未在表单中定义的属性会被初始化为null。示例视图代码:

@using (Html.BeginForm("Test", "Cart", FormMethod.Post))
{
    @Html.TextBoxFor(m => m.name)
    <!-- 提交Carts的关键标识字段 -->
    @Html.HiddenFor(m => m.Carts.Id)
    <!-- 提交Orders的必要字段 -->
    @Html.HiddenFor(m => m.Orders.User.Id)
    
    <input type="submit" value="Submit" />
}

3. 验证模型绑定(可选)

如果只需要获取name值,仅完成步骤1即可。此时POST方法中就能正常获取test.name的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:10:29