Asp.net核心EF 3DropDown在编辑表格系列,将保存在删除导航属性tabels
我有4个实体领域: 车辆,VehicleBrand,VehicleModel,VehicleVersionAsp.net核心EF 3DropDown在编辑表格系列,将保存在删除导航属性tabels
编辑形式使用jQuery,第一下拉由ViewBag feeded,并且通过的Json其他2。
当我保存的下拉菜单retrn唯一ID! dooh!
但我希望绑定实体
正如你可以看到vbName回来空和调用SaveChanges之后。在所有实体有名称字段空
这里是编辑的控制器代码:
[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();
我觉得我缺少简单的东西,或者是一个错误的方法。
问题出现在模型中!我用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“)车辆车辆)
感谢您的耐心!:)
就像一个魅力! :)
您应该使用
@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
问题的代码是,与尊重在您发布视图中使用的模型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财产
我不在我的模型模型中没有。VehicleBrandid是在迁移/更新时通过导航属性在数据库中生成的,我想我必须添加到我的模型特定字段中。 – CristiC777