2014-12-22 1 views
1

이전 질문의 연속입니다. 스티븐의 도움으로 MVC 드롭 다운 포스트 백 문제

MVC Dropdown using ViewModels without Magic String

, 나는 지금은 편집 방법과 도움이 필요, 작성 방법이 작동하게 관리 할 수 ​​있습니다.

나는 Get Edit() 메소드를 가져올 수 있지만 다시 게시하면 드롭 다운의 새 값을 저장하지 않습니다. 디버거를 사용하고 이유를 볼 수 없습니다. 그것은 그것이 가정하고 있었던 것처럼하고있는 것처럼 보였다.

// GET: Parents/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 

     Parent parent = db.Parents.Find(id); 

     if (parent == null) 
     { 
      return HttpNotFound(); 
     } 

     ParentVM viewModel = new ParentVM() 
     { 
      CourtList = new SelectList(db.Courts, "CourtId", "CourtName"), 
      SelectedCourt = parent.Court.CourtId, 
      ParentID = parent.ParentID, 
      FirstName = parent.FirstName, 
      LastName = parent.LastName, 
      Children = parent.Childs.Select(c => new ChildVM() 
      { 
       ChildID = c.ChildID, 
       ParentID = c.ParentID, 
       Name = c.Name, 
       DOB = c.DOB, 
       Address = c.Address 
      }).ToList(), 

     }; 

     return View(viewModel); 

    } 

    // POST: Parents/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(ParentVM viewModel) 
    { 
     if (ModelState.IsValid) 
     { 

      Court court = db.Courts.Find(viewModel.SelectedCourt); 
      var parent = new Parent() 
      { 
       FirstName = viewModel.FirstName, 
       LastName = viewModel.LastName, 
       ParentID = viewModel.ParentID, 
       Court = court 

      }; 

      db.Entry(parent).State = EntityState.Modified; 

      foreach (ChildVM item in viewModel.Children) 
      { 

       var child = new Child() 
       { 
        Name = item.Name, 
        DOB = item.DOB, 
        Address = item.Address, 
        ParentID = viewModel.ParentID, 
        ChildID = item.ChildID 
       }; 


       db.Entry(child).State = child.ChildID == 0 ? 
           EntityState.Added : 
           EntityState.Modified; 

      } 



      var findChild = db.Childs.Where(x => x.ParentID == viewModel.ParentID).ToList(); 

      foreach (var item in findChild) 
      { 

       var deleteChild = viewModel.Children.Where(x => x.ChildID == item.ChildID).SingleOrDefault(); 

       if (deleteChild == null) 
       { 
        db.Childs.Remove(item); 
       } 

      } 

      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     viewModel.CourtList = new SelectList(db.Courts, "CourtId", "CourtName"); 
     return View(viewModel); 
    } 
+0

게시물을 처리하려면 다른 방법이 필요합니다. 그 하나는 얻는 것입니다. –

+0

둘 다 거기에 있습니다. 아래로 스크롤해야합니다. –

+0

db.SaveChanges()에 중단 점 넣기; 그것이 맞았는지 확인하십시오. 그렇다면이 시점에서 db.Courts를보고 업데이트 된 값을 보유하고 있는지 확인하십시오. – Gouda

답변

0

이 코드를 시험해보십시오. 질문이 있으면 그냥 물어보십시오.
코드 내부의 내 의견을 확인하십시오.

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(ParentVM viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     Court court = db.Courts.Find(viewModel.SelectedCourt); 
     var parent = db.Parents.FirstOrDefault(x => x.ParentID == viewModel.ParentID); 
     if (parent != null) 
     { 
      // Parent exists in DB --> You can just update it 
      parent.FirstName = viewModel.FirstName; 
      parent.LastName = view; 
      Model.LastName; 
      parent.ParentID = viewModel.ParentID; 
      parent.Court = court; 
     } 
     else 
     { 
      // Parent does not exist in DB --> You have to Add a new Parent 
      db.Parents.Add(new Parent() 
      { 
       FirstName = viewModel.FirstName, 
       LastName = viewModel.LastName, 
       ParentID = viewModel.ParentID, 
       Court = court 
      }); 
     } 

     foreach (ChildVM item in viewModel.Children) 
     { 
      // Here you can do exactly the same like you did bevore with your Parents 
      // First search for your Child in DB 
      var child = db.Childs.FirstOrDefault(x => x.ChildID == item.ChildID); 
      if (child != null) 
      { 
       child.Name = item.Name; 
       child.DOB = item.DOB; 
       child.Address = item.Address; 
       child.ParentID = viewModel.ParentID; 
       child.ChildID = item.ChildID; 
      } 
      else 
      { 
       db.Childs.Add(new Child() 
       { 
        Name = item.Name, 
        DOB = item.DOB, 
        Address = item.Address, 
        ParentID = viewModel.ParentID, 
        ChildID = item.ChildID 
       }); 
      } 
     } 

     // Here I don't get what you want to do... 
     // Can you explain me that? 
     var findChild = db.Childs.Where(x => x.ParentID == viewModel.ParentID).ToList(); 

     foreach (var item in findChild) 
     { 
      var deleteChild = viewModel.Children.Where(x => x.ChildID == item.ChildID).SingleOrDefault(); 

      if (deleteChild == null) 
      { 
       db.Childs.Remove(item); 
      } 
      } 

      db.SaveChanges(); 
      return RedirectToAction("Index"); 
    } 

    viewModel.CourtList = new SelectList(db.Courts, "CourtId", "CourtName"); 
    return View(viewModel); 
} 
+0

도움을 주셔서 감사합니다. 방금 코드를 사용했는데 다음 오류가 발생합니다. 모든 코드 경로가 값을 반환하지는 않습니다. 이 행의 편집을 강조 표시합니다. public ActionResult Edit (ParentVM viewModel) 성으로 입력 한 내용을 수정합니다. –

+0

또한, 마지막 비트, 당신은 그것이 무엇인지 물어 보았습니까? 그것은 자식 문서를 제거 할 때 내 코드입니다. 행을 추가 또는 제거하는 jquery 코드가 있습니다. 이제 데이터베이스의 행을 삭제하고 싶습니다. –

+0

@Hockey_Fan 내 업데이트 된 코드를 확인하십시오. 귀하의 자녀를 제거하기위한 귀하의 코드가 작동하지만 그것을 시도해보십시오 모르겠어요 – brothers28

관련 문제