1

我有4个实体领域: 车辆,VehicleBrand,VehicleModel,VehicleVersionAsp.net核心EF 3DropDown在编辑表格系列,将保存在删除导航属性tabels

enter image description here

在一对一许多关系,代码优先由ef生成。
数据库看起来像: enter image description here

编辑形式使用jQuery,第一下拉由ViewBag feeded,并且通过的Json其他2。

编辑形式是: enter image description here

当我保存的下拉菜单retrn唯一ID! dooh!
但我希望绑定实体
enter image description here

正如你可以看到vbName回来和调用SaveChanges之后。在所有实体有名称字段
enter image description here

这里是编辑的控制器代码:

[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); 
    } 

和后:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> YourEditNewCar(int id, [Bind("id,DoorsNr,isAvailable,isDamaged,isDeleted,FabricationDate,FuelTankCapacity,TrunckCapacity,OnBoardKm,SeatNr," + 
                    "LicencePlate, VehicleBrand, VehicleModel, VehicleVersion")] Vehicle vehicle) 
    { 
     var user = await _userManager.GetUserAsync(User); 

     if (ModelState.IsValid) 
     { 
      try 
      { 
       _context.Update(vehicle); 
       await _context.SaveChangesAsync(); 
      } 
      catch (DbUpdateConcurrencyException) 
      { 
       if (!VehicleExists(vehicle.id)) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        throw; 
       } 
      } 

      return RedirectToAction("YourCar", "Manage"); 
     } 
     return View(vehicle); 
    } 
在编辑形式下拉菜单

是这样的:

<hr> 
     <div class="col-md-12 text-center"><h4> Please select :</h4></div> 

     <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.VehicleBrand.id, (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.VehicleModel.id, 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.VehicleVersion.id, new SelectList(string.Empty), "Car Version", new { style = "width: 110px;", @class = "form-control" }) 
      </div> 
     </div> 

和编辑表单的纸条,养活下拉菜单,就是这样:

<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> 

所有下拉菜单都很完美,返回只是id。
当我SaveChanges,即使我想保存只有在车辆表中,它也更新其他实体,通过导航属性。

_context.Update(vehicle); 
    await _context.SaveChangesAsync(); 

我想这不更新VehicleBrands,但没有效果:
enter image description here

,这需要一个新的对象:
enter image description here

我觉得我缺少简单的东西,或者是一个错误的方法。

问题出现在模型中!我用Just:public vehicleBrand VehicleBrand {get;组; } 不宣为ForeignKey的
我在模型添加的字段:
[ForeignKey的( “VehicleVersionid”)]
公众诠释VehicleVersionid {得到;组; }

现在我加入(加粗)的型号:

[ForeignKey的( “VehicleBrandid”)
公众诠释VehicleBrandid {获得;组; }

public vehicleBrand VehicleBrand {get;组; }

[ForeignKey的( “VehicleModelid”)]
公众诠释VehicleModelid {得到;组; }

public VehicleModel VehicleModel {get;组; }

[ForeignKey的( “VehicleVersionid”)]
公众诠释VehicleVersionid {得到;组; }

public VehicleVersion VehicleVersion {get;组; }

而在编辑:
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务YourEditNewCar(INT ID,[装订(“ID,DoorsNr,isAvailable,的isDamaged,请将isDeleted,FabricationDate,FuelTankCapacity,TrunckCapacity, OnBoardKm,SeatNr, “+ ” LicencePlate,VehicleBrandid,VehicleModelid,VehicleVersionid“)车辆车辆)

感谢您的耐心!:)
就像一个魅力! :)

回答

1

您应该使用

@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" }) 

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

或者,如果你想开始使用taghelpers在asp.net核心,你可以使用这个参考:https://docs.microsoft.com/en-us/aspnet/core/mvc/views/working-with-forms#the-select-tag-helper

1

问题的代码是,与尊重在您发布视图中使用的模型MVC的ModelState验证处理。所以在这个模型中就是车辆,所以我们需要为车辆提供模型的价值。 vehicleBrand,VehicleModel,VehicleVersion是不同的模型,并且该字段中的值在发布时对Vehicle模型没有任何依赖关系。所以鉴于你需要使用这样的

<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> 

,一次在视图中使用的一个模型,它是将我们改变了整个财产的实体则是难以管理和检查entitystate.unchanged财产

+0

我不在我的模型模型中没有。VehicleBrandid是在迁移/更新时通过导航属性在数据库中生成的,我想我必须添加到我的模型特定字段中。 – CristiC777