Asp.net core Asp.net Core EF 3在编辑表单上串联下拉,保存将删除导航属性选项卡中的字段
我有4个实体: 车辆,车辆品牌,车辆模型,车辆导航 在一对多关系中,代码首先由ef生成。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
数据库如下所示: 编辑表单使用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>