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

ASP.NET Core MVC模型绑定问题:视图向控制器传递空值

解决ASP.NET Core MVC嵌套模型绑定空值问题

核心原因

当你用CreateProductViewModel作为视图模型时,表单字段的name属性会生成objcreateproduct.XXX(比如objcreateproduct.ProductName),但控制器Action如果直接接收Create_Product类型的参数,模型绑定器会默认查找XXX格式的字段名,匹配不上就会返回空对象。而直接用Create_Product做模型时,字段name就是XXX,所以能正常绑定。

解决方法

方法1:控制器接收视图模型类型

把Action的参数改成CreateProductViewModel,然后从中提取objcreateproduct属性:

[HttpPost]
public IActionResult Create(CreateProductViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        Create_Product product = viewModel.objcreateproduct;
        // 后续业务逻辑
        return RedirectToAction("Index");
    }
    return View(viewModel);
}

这种方式最直接,也符合视图模型的设计初衷。

方法2:给控制器参数添加[Bind(Prefix)]特性

如果一定要单独接收Create_Product类型的参数,可以用[Bind(Prefix)]指定绑定前缀,让模型绑定器识别objcreateproduct.XXX格式的字段:

[HttpPost]
public IActionResult Create([Bind(Prefix = "objcreateproduct")] Create_Product product)
{
    if (ModelState.IsValid)
    {
        // 业务逻辑
        return RedirectToAction("Index");
    }
    // 返回视图时需构造视图模型,否则表单绑定会出错
    var viewModel = new CreateProductViewModel { objcreateproduct = product };
    return View(viewModel);
}

方法3:检查视图绑定的正确性

确认视图中asp-for的表达式是否正确,示例代码如下:

<input asp-for="objcreateproduct.ProductName" class="form-control" />
<label asp-for="objcreateproduct.ProductName"></label>
<span asp-validation-for="objcreateproduct.ProductName" class="text-danger"></span>

可以通过浏览器开发者工具检查生成的HTML,确认字段name为objcreateproduct.ProductName。

额外注意事项

  • 确保Create_Product类的属性是公共可读写(包含get和set方法),模型绑定器无法绑定私有或只读属性。
  • 排查是否有自定义模型绑定器干扰了默认绑定逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:52:04