Asp.net core Asp.net Core EF 3在编辑表单上串联下拉,保存将删除导航属性选项卡中的字段

Asp.net core Asp.net Core EF 3在编辑表单上串联下拉,保存将删除导航属性选项卡中的字段,asp.net-core,entity-framework-core,dropdown,navigation-properties,Asp.net Core,Entity Framework Core,Dropdown,Navigation Properties,我有4个实体: 车辆,车辆品牌,车辆模型,车辆导航 在一对多关系中,代码首先由ef生成。 数据库如下所示: 编辑表单使用jQuery,第一个下拉列表由ViewBag提供,另外两个下拉列表由Json提供。 编辑表格如下: 保存下拉列表时,仅返回id!哇 但我的绑定预期实体 如您所见,vbName在保存更改后返回null。。在所有实体中,名称字段为空 以下是用于编辑的控制器代码: [HttpGet] public async Task<IActionResult> Yo

我有4个实体: 车辆,车辆品牌,车辆模型,车辆导航

在一对多关系中,代码首先由ef生成。
数据库如下所示:

编辑表单使用jQuery,第一个下拉列表由ViewBag提供,另外两个下拉列表由Json提供。

编辑表格如下:

保存下拉列表时,仅返回id!哇
但我的绑定预期实体

如您所见,vbName在保存更改后返回null。。在所有实体中,名称字段为空

以下是用于编辑的控制器代码:

[HttpGet]
    public async Task<IActionResult> YourEditNewCar(int? id)
    {
        if (id == null)
        {
            return NotFound();
        }
        var brands = await _context.VehicleBrands.OrderBy(b => b.vbName).Select(x => new { Id = x.id, Value = x.vbName }).ToListAsync();
        var models = await _context.VehicleModels.OrderBy(m => m.vmName).ToListAsync();
        var versions= await _context.VehicleVersions.OrderBy(v =>v.vvName).ToListAsync();

        var model = new Vehicle();         

        ViewBag.BrandList =  new SelectList(brands, "Id", "Value");

        model = await _context.Vehicles.SingleOrDefaultAsync(m => m.id == id);
        if (model == null)
        {
            return NotFound();
        }
        return View("~/Views/Manage/YourEditNewCar.cshtml", model);                         
    }


    public JsonResult getVehicleModelById(int id)
    {
        List<VehicleModel> vehicleModelList = new List<VehicleModel>();
        vehicleModelList = _context.VehicleModels.Where(m => m.VehicleBrand.id == id).OrderBy(m => m.vmName).ToList();          //.Select(y => new { Id = y.id, Value = y.vmName })
        vehicleModelList.Insert(0, new VehicleModel { id = 0, vmName = "Car Model" });

        return Json(vehicleModelList);
    }

    public JsonResult getVehicleVersionById(int id)
    {
        List<VehicleVersion> vehicleVersionList = new List<VehicleVersion>();
        vehicleVersionList = _context.VehicleVersions.Where(m => m.VehicleModel.id == id).OrderBy(m => m.vvName).ToList();          //.Select(y => new { Id = y.id, Value = y.vmName })
        vehicleVersionList.Insert(0, new VehicleVersion { id = 0, vvName = "Car Version" });

        return Json(vehicleVersionList);
    }
我尝试不更新车辆品牌,但没有效果:

这需要一个新对象:

我觉得我错过了一些简单的东西,或者是一个错误的方法。

问题出在模型中!我只使用了:公共车辆品牌车辆品牌{get;set;} 不将字段声明为ForeignKey
我在模型中添加了:
[ForeignKey(“VehiclerVersionID”)]
公共int VehiclerVersionID{get;set;}

现在我在模型中添加了(粗体):

[外键(“车辆品牌”)]
公共int车辆品牌标识{get;set;}

公共车辆品牌车辆品牌{get;set;}

[外键(“车辆模型”)]
公共int车辆模型{get;set;}

公共车辆模型车辆模型{get;set;}

[ForeignKey(“VehiclerVersionID”)]
公共int VehiclerVersionID{get;set;}

公共车辆导航车辆导航{get;set;}

并在中编辑:
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务YourEditNewCar(int id、[Bind”(“id、DoorsNr、可用、损坏、删除、制造日期、油箱容量、TruncCapacity、车载公里数、SeatNr,”+ “牌照牌,车辆品牌标识、车辆模型、车辆识别号””)车辆)

谢谢你的耐心!:)
工作起来很有魅力!:)

您应该使用

@Html.DropDownListFor(model => model.VehicleBrandid, (SelectList)ViewBag.BrandList, "Car Brand", new { style = "width: 140px;", @class = "form-control" })
不是

将下拉列表绑定到车辆实体中的id字段,而不是相关实体中的id字段


或者,如果您想开始在asp.net core中使用taghelpers,您可以使用以下参考:

代码的问题是,mvc modelstate验证处理与发布视图中使用的模型有关。在这里,你们的模型是车辆,所以关于车辆,我们需要给出模型的值。vehicleBrand、VehicleModel、VehicleVersion是不同的车型,该字段中的值在发布时与车型没有任何依赖关系。因此,鉴于此,您需要像这样使用

<div class="row row-list">
        <div class="form-group col-xs-4">
            <label asp-for="VehicleBrand" class="control-label hidden" value=""></label>
            @Html.DropDownListFor(model => model.VehicleBrandid, (SelectList)ViewBag.BrandList, "Car Brand", new { style = "width: 140px;", @class = "form-control" })
       </div>

        <div class="form-group  col-xs-4">
            <label asp-for="VehicleModel" class="control-label hidden" value=""></label>
            @Html.DropDownListFor(model => model.VehicleModelid, new SelectList(string.Empty), "Car Model", new { style = "width: 120px;", @class = "form-control" })
        </div>

        <div class="form-group  col-xs-4">
            <label asp-for="VehicleVersion" class="control-label hidden" value=""></label>
            @Html.DropDownListFor(model => model.VehicleVersionid, new SelectList(string.Empty), "Car Version", new { style = "width: 110px;", @class = "form-control" })
        </div>
    </div>

@Html.DropDownListFor(model=>model.VehicleBrandid,(SelectList)ViewBag.BrandList,“汽车品牌”,新{style=“width:140px;”,@class=“form control”})
@Html.DropDownListFor(model=>model.VehicleModelid,new SelectList(string.Empty),“汽车模型”,new{style=“width:120px;”,@class=“form control”})
@Html.DropDownListFor(model=>model.vehicleroversionid,新选择列表(string.Empty),“汽车版本”,新{style=“width:110px;”,@class=“form control”})

一旦视图中使用了一个模型,我们会将整个属性更改为实体,那么就很难管理和检查entitystate。未更改的属性

我的模型中没有。VehicleBrandid,是在数据库中通过ef migrate/update上的导航属性生成的,我想我必须添加到我的模型特定字段中。
<script>
$(function () {
    $("#VehicleBrand_id").change(function () {
        //alert("Vehicle Brand dd changed !");
        var url = '@Url.Content("~/Manage/getVehicleModelById")';
        var ddlsource = "#VehicleBrand_id";

        $.getJSON(url, { id: $(ddlsource).val() }, function (data) {
            var items = '';
            $("#VehicleModel_id").empty();
            $.each(data, function (i, row) {
                items += "<option value='" + row.id + "'>" + row.vmName + "</option>";
            });
            $("#VehicleModel_id").html(items);
        })
    });
});
</script>
 _context.Update(vehicle);
  await _context.SaveChangesAsync();
@Html.DropDownListFor(model => model.VehicleBrandid, (SelectList)ViewBag.BrandList, "Car Brand", new { style = "width: 140px;", @class = "form-control" })
@Html.DropDownListFor(model => model.VehicleBrand.id, (SelectList)ViewBag.BrandList, "Car Brand", new { style = "width: 140px;", @class = "form-control" })
<div class="row row-list">
        <div class="form-group col-xs-4">
            <label asp-for="VehicleBrand" class="control-label hidden" value=""></label>
            @Html.DropDownListFor(model => model.VehicleBrandid, (SelectList)ViewBag.BrandList, "Car Brand", new { style = "width: 140px;", @class = "form-control" })
       </div>

        <div class="form-group  col-xs-4">
            <label asp-for="VehicleModel" class="control-label hidden" value=""></label>
            @Html.DropDownListFor(model => model.VehicleModelid, new SelectList(string.Empty), "Car Model", new { style = "width: 120px;", @class = "form-control" })
        </div>

        <div class="form-group  col-xs-4">
            <label asp-for="VehicleVersion" class="control-label hidden" value=""></label>
            @Html.DropDownListFor(model => model.VehicleVersionid, new SelectList(string.Empty), "Car Version", new { style = "width: 110px;", @class = "form-control" })
        </div>
    </div>