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

提交表单时绑定嵌入式类型:如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:15:43