MVC 下拉回发问题

本文关键字:问题 MVC | 更新日期: 2023-09-27 18:34:50

这是前面问题的延续。

MVC 下拉列表使用 ViewModels 不带魔术字符串

在斯蒂芬的帮助下,我设法使创建方法工作,现在我需要编辑方法的帮助。

我设法让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);
    }

MVC 下拉回发问题

请尝试此代码。如果您有任何问题,请询问。
查看我在代码中的注释。

[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);
}