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

