为何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
相关产品推荐
相关产品推荐

