一对多关系将另一个值设置为false

时间:2017-09-04 12:21:38

标签: asp.net-mvc asp.net-mvc-4

我有2个表格。一个叫做Help,另一个叫做HelpSolution。帮助可以有很多解决方案。这是他们的模特。

public class Help
{
    public int ID { get; set; }
    public string Description { get; set; }
    public Priority? Priority { get; set; }
    public bool Condition { get; set; }
    public int? EmployeeID { get; set; }
    public int? HelpCategoryID { get; set; }
    public int? HelpTypeID { get; set; }
    public virtual Employee Employee { get; set; }
    public virtual HelpCategory HelpCategory { get; set; }
    public virtual HelpType HelpType { get; set; }
    public virtual ICollection<HelpSolution> HelpSolutions { get; set; }
}

(是的,我知道,它有很多价值,大部分都不重要,但是最后一个)

public class HelpSolution
{
    public int ID { get; set; }
    public string Solution { get; set; }
    public virtual int? HelpID { get; set; }
    public virtual Help Help { get; set; }
    public bool Selected { get; set; }

}

在帮助视图中,我创建了一个名为Submit的新Action,其中我基本上使用复选框确认哪些解决方案有效。在该表单中,我在复选框中显示该特定帮助的解决方案(使用HelpID)。我想做一个我提交的表单,按下复选框,它将数据库中的HelpSolution值从 false更改为true ,因为我认为它已被选为有效的解决方案(帮助可以有许多解决方案和许多有效的解决方案。)

我在Controller中创建了一个ActionResult,但它非常垃圾,所以我来这里询问我怎么能这样做?任何帮助都非常感谢。

这是行动:

public ActionResult Submit(int id)
    {
       HelpViewModel help = Mapper.Map<Help, 
       HelpViewModel(unitOfWork.HelpRepository.GetByID(id));
        if (help == null)
        {
            return HttpNotFound();
        }
        return View(help);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Submit(HelpViewModel model)
    {
        if (ModelState.IsValid)
        {

            Help help = Mapper.Map<Help>(model);
            AddOrUpdateSolutions(help, model.HelpSolutions);
            unitOfWork.HelpRepository.Update(help);
            unitOfWork.Save();
            return RedirectToAction("Details", new { id = model.ID });
        }
        return View(model);
    }

我尝试设置值的操作是AddOrUpdateSolutions,但我写的很糟糕所以我认为它不会有帮助。我只需要知道如何做这件事。

1 个答案:

答案 0 :(得分:0)

嗯,我自己找到了一个解决方案,可能它非常糟糕,但它确实有效,我没有其他想法。

    public ActionResult Submit(int id)
    {
        HelpViewModel help = Mapper.Map<Help, HelpViewModel>(unitOfWork.HelpRepository.GetByID(id));
        if (help == null)
        {
            return HttpNotFound();
        }
        return View(help);
    }
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Submit(HelpViewModel model)
    {
        if (ModelState.IsValid)
        {
            Help help = Mapper.Map<HelpViewModel,Help>(model);
            model.HelpSolutions = PopulateSolutionData(model.ID);

            foreach (var solution in help.HelpSolutions)
            {
                var entityItem = db.HelpSolutions.FirstOrDefault(s => s.ID == solution.ID);
                if (solution.Selected == true){
                        entityItem.Selected = true;
                }
                else{
                    entityItem.Selected = false;
                }
                db.Entry(entityItem).State = EntityState.Modified;
                db.SaveChanges();
            }

            return RedirectToAction("Details", new { id = model.ID });
        }
        return View(model);
    }

PopulateSolutionData只是从数据库填充解决方案并将它们全部设置为false。基本上解决这个问题的是使用db而不是UnitOfWork,只使用if设置值并将entitystate设置为modified。