.NET Core 6表单提交SheetViewModel始终为null的问题求助
问题解决:.NET Core 6表单提交后SheetViewModel接收为null
问题描述
在.NET Core 6项目中,提交表单时控制器的sheetdatabase方法接收的SheetViewModel始终为null,即便表单所有值都已填写。当前视图使用Tuple<SheetViewModel, List<SheetViewModel>, List<SheetViewModel>>作为模型,表单绑定@Model.Item1的属性,页面能正常展示数据库数据,但提交后模型为空。
相关代码
- 视图模型声明(.cshtml):
@model Tuple<CI_platform.Entities.ViewModels.SheetViewModel, List<CI_platform.Entities.ViewModels.SheetViewModel>, List<CI_platform.Entities.ViewModels.SheetViewModel>>
- 表单代码(.cshtml):
<form method="post" asp-action="sheetdatabase" asp-controller="TimeSheet">...</form>
- 控制器接收方法:
public IActionResult sheetdatabase(SheetViewModel model){...}
- 视图GET方法:
public IActionResult volunteersheet(){...}
- SheetViewModel类:
public class SheetViewModel{...}
问题原因
视图使用Tuple作为模型时,绑定@Model.Item1属性生成的HTML字段name会带有Item1.前缀(比如Item1.Username)。而控制器参数是SheetViewModel model,默认模型绑定器会寻找不带前缀的字段名(比如Username),两者不匹配导致无法正确绑定,最终model为null。
解决方案
方案1:给控制器参数添加绑定前缀标注
修改控制器方法,用[Bind(Prefix = "Item1")]告诉模型绑定器匹配带Item1.前缀的字段:
public IActionResult sheetdatabase([Bind(Prefix = "Item1")] SheetViewModel model) { // 业务逻辑代码 }
方案2:手动修改表单字段的name属性
在表单绑定属性时,手动指定name属性去掉Item1.前缀。例如原本的:
<input asp-for="Item1.Username" />
改为:
<input asp-for="Item1.Username" name="Username" />
这样提交的字段名就和控制器参数的属性名匹配了。
方案3:创建复合视图模型(推荐)
Tuple可读性和扩展性差,建议创建专门的复合视图模型替代:
public class VolunteerSheetViewModel { public SheetViewModel CurrentSheet { get; set; } public List<SheetViewModel> PastSheets { get; set; } public List<SheetViewModel> ApprovedSheets { get; set; } }
修改视图模型声明:
@model CI_platform.Entities.ViewModels.VolunteerSheetViewModel
表单绑定改为@Model.CurrentSheet的属性:
<input asp-for="CurrentSheet.Username" />
控制器接收方法可选择直接接收复合模型:
public IActionResult sheetdatabase(VolunteerSheetViewModel model) { var sheetModel = model.CurrentSheet; // 业务逻辑代码 }
内容的提问来源于stack exchange,提问作者GALAXY A50
相关产品推荐
相关产品推荐

