ASP.NET Core 2.0视图模型提交未用属性返回null问题求助
解决ASP.NET Core 2.0 MVC视图模型仅部分属性提交的问题
兄弟,这个问题我之前也碰到过,本质是ASP.NET Core的模型绑定规则导致的——它只会把请求里存在的字段绑定到模型上,视图里没输出的属性自然不会被提交到服务器,所以控制器里那些没在视图里用到的属性就都是null了。给你几个实用的解决办法:
方法一:用隐藏字段保留其他属性值
如果需要把视图模型里的所有属性都提交回服务器,最简单的方式就是把那些不在可见输入框里的属性,用隐藏字段的形式渲染到表单中。这样表单提交时,这些隐藏字段的值会和可见输入框一起发送到服务器,模型绑定就能拿到完整的属性值了。
举个例子,假设你的IssueTrackerIssue还有Id、Title等其他属性,你可以在视图里添加对应的隐藏字段:
<!-- 保留其他属性的隐藏字段 --> <input type="hidden" asp-for="IssueTrackerIssue.Id" /> <input type="hidden" asp-for="IssueTrackerIssue.Title" /> <!-- 你原本的输入字段 --> <div class="form-group"> <label asp-for="IssueTrackerIssue.OrderNumber"></label> <input asp-for="IssueTrackerIssue.OrderNumber" class="form-control" /> </div> <div class="form-group"> <label asp-for="IssueTrackerIssue.CloseIssue"></label> <input asp-for="IssueTrackerIssue.CloseIssue" class="form-control" /> </div>
方法二:从数据库重新加载完整模型(推荐用于数据可从服务端获取的场景)
如果你的视图模型数据原本是从数据库读取的,那其实不需要把所有属性都通过表单提交。你可以在控制器的POST方法里,先根据已知的唯一标识(比如Id)从数据库查询出完整的实体,再把表单提交过来的属性值覆盖到这个实体上,这样就能得到完整的模型了。
示例代码如下:
[HttpPost] public IActionResult UpdateIssue(YourViewModel viewModel) { if (!ModelState.IsValid) { return View(viewModel); } // 从数据库获取完整的Issue实体 var fullIssue = _dbContext.IssueTrackerIssues.Find(viewModel.IssueTrackerIssue.Id); if (fullIssue == null) { return NotFound(); } // 用提交过来的属性值覆盖原有值 fullIssue.OrderNumber = viewModel.IssueTrackerIssue.OrderNumber; fullIssue.CloseIssue = viewModel.IssueTrackerIssue.CloseIssue; // 保存到数据库 _dbContext.SaveChanges(); return RedirectToAction(nameof(Index)); }
补充说明:模型绑定的核心逻辑
ASP.NET Core的模型绑定是基于请求数据工作的:只有当请求中包含某个属性对应的键值对时,模型绑定才会给该属性赋值。如果视图里没有输出某个属性,请求中就不会有这个字段,模型对应的属性就会是默认值(引用类型为null,值类型为对应类型的默认值,比如int是0,bool是false)。
内容的提问来源于stack exchange,提问作者ifinlay
相关产品推荐
相关产品推荐

