1

내가 네 기관이 필드를 삭제합니다 많은 관계, ef에 의해 생성 된 코드 우선. 그런
데이터베이스보기 : enter image description hereAsp.net 코어 EF 3DropDown, 저장 탐색 속성 tabels입니다

편집 양식을 사용 jQuery를이 첫번째 드롭 다운은 ViewBag에 의해 feeded 및 JSON에 의해 ​​다른이된다. enter image description here

내가 저장할 때 드롭 다운 만 해당 ID를 retrn :

편집 양식은있다! dooh!
하지만 내 바인딩이 실체 기대는

enter image description here

당신이 vbName을 볼 수 있듯이 이름 필드 널 (null)이 모든 엔티티에 및 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를 사용하면 Vehicle 테이블에서만 저장하려고해도 탐색 속성으로 다른 항목에서도 업데이트됩니다.

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

나는 VehicleBrands를 업데이트하기 위해 시도했지만 효과가 없습니다 :
enter image description here

을이 새로운 개체가 필요합니다 내가 난 느낌
enter image description here

을 간단한 것을 놓치거나 잘못된 접근입니다.

모델에 문제가 있습니다!나는 Just를 사용했다 : public VehicleBrand VehicleBrand {get; 세트; } 내가 모델에 추가 된 외래 키
로 필드 선언하지 않고
:
[외래 키 ("VehicleVersionid을")]
공공 INT VehicleVersionid {얻을; 세트; }

가 지금은 모델에 (굵게 포함) 추가 :

[외래 키 ("VehicleBrandid")]
공공 INT VehicleBrandid {얻을; 세트; }

public VehicleBrand VehicleBrand {get; 세트; }

[외래 키 ("VehicleModelid")]
공개 VehicleModelid INT {얻는다; 세트; }

public VehicleModel VehicleModel {get; 세트; }

[외래 키 ("VehicleVersionid")]
공개 INT {VehicleVersionid 얻는다; 세트; }

public VehicleVersion VehicleVersion {get; 세트; }

그리고 편집 :
[HttpPost]
[ValidateAntiForgeryToken] 작업 YourEditNewCar (INT 아이디, [바인드 ("ID, DoorsNr, isAvailable, isDamaged,으로 isDeleted, FabricationDate, FuelTankCapacity, TrunckCapacity 비동기
공개, OnBoardKm, SeatNr는 "+는 "LicencePlate는 는 VehicleBrandid, VehicleModelid는 VehicleVersionid ")] 자동차 차량) 양해

감사합니다! :) 마법처럼
작품! :)

답변

1

당신은 할 관련 개체의 id 필드, 차량 개체의 id 필드에 드롭 다운 목록 결합하지

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

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

를 사용한다.

아니면 당신이 참조를 사용할 수 asp.net 코어에 taghelpers를 사용하여 시작하기를 원한다면 : 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