2014-12-22 2 views
1

Это продолжение предыдущих вопросов.Вывод с обратной связью MVC

MVC Dropdown using ViewModels without Magic String

С помощью Стефана, мне удается сделать Создать методы работы, теперь мне нужна помощь с методами Edit.

Мне удается получить метод 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) Я также исправляю опечатку, которую вы имели с LastName. –

+0

Кроме того, последний бит, вы спросили, что он делает. Это мой код, когда я удаляю дочерние документы. У меня есть код jquery, который добавляет или удаляет строки. Теперь я хочу также удалить строки в базе данных, если нужно. –

+0

@Hockey_Fan, пожалуйста, ознакомьтесь с моим обновленным кодом. Я не знаю, будет ли ваш код для удаления ваших детей работать, но дайте ему попробовать – brothers28

Смежные вопросы