提交表单时绑定嵌入式类型:如何让Car控制器与视图支持Engine属性
解决方案
1. 修改控制器的Create方法
1.1 更新[Bind]特性
将Engine的所有属性以Engine.属性名的格式添加到Bind列表中,确保模型绑定能正确接收Engine的参数:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Create([Bind("Id,OwnerName,Make,Model,RegistrationNumber,Vin,Engine.Capacity,Engine.EngineType,Engine.Aspiration,Engine.OilSumpCapacity")] Car car) { if (ModelState.IsValid) { car.Id = Guid.NewGuid(); _context.Add(car); await _context.SaveChangesAsync(); return RedirectToAction(nameof(Index)); } return View(car); }
1.2 初始化Engine实例(GET方法)
在GET请求的Create方法中,提前初始化Car的Engine属性,避免视图访问Engine字段时出现空引用异常:
public IActionResult Create() { return View(new Car { Engine = new Engine() }); }
2. 修改Create.cshtml视图
在表单中添加Engine相关属性的输入字段,使用asp-for="Engine.属性名"的格式绑定Owned实体的属性:
<form asp-action="Create"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <!-- 原有Car属性字段保持不变 --> <div class="form-group"> <label asp-for="OwnerName" class="control-label"></label> <input asp-for="OwnerName" class="form-control" /> <span asp-validation-for="OwnerName" class="text-danger"></span> </div> [...] <!-- 添加Engine属性字段 --> <div class="form-group"> <label asp-for="Engine.Capacity" class="control-label"></label> <input asp-for="Engine.Capacity" class="form-control" /> <span asp-validation-for="Engine.Capacity" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Engine.EngineType" class="control-label"></label> <select asp-for="Engine.EngineType" class="form-control" asp-items="Html.GetEnumSelectList<EngineType>()"></select> <span asp-validation-for="Engine.EngineType" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Engine.Aspiration" class="control-label"></label> <select asp-for="Engine.Aspiration" class="form-control" asp-items="Html.GetEnumSelectList<Aspiration>()"></select> <span asp-validation-for="Engine.Aspiration" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Engine.OilSumpCapacity" class="control-label"></label> <input asp-for="Engine.OilSumpCapacity" class="form-control" /> <span asp-validation-for="Engine.OilSumpCapacity" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-primary" /> </div> </form>
补充说明
EF Core中通过OwnsOne配置的Owned实体是主实体的组成部分,模型绑定时必须通过主实体.子实体属性.子实体字段的格式指定绑定关系,而脚手架默认不会自动生成这类关联字段,因此需要手动添加上述内容来实现表单对Engine属性的提交处理。
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

