2017-09-04 8 views
0

私は2つのフォームを持っています。 1つはヘルプと呼ばれ、もう1つはHelpSolutionと呼ばれます。ヘルプには多くのソリューションがあります。ここにそのモデルがあります。ヘルプビューで1対多関係別の値をfalseに設定する

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

(はい、私は知っている、それはほとんどがここでは重要ではありません、値をたくさん持っているが、最後の1)

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

} 

私はどこ提出と呼ばれる新しいアクションを作成私は基本的にチェックボックスを使ってどのソリューションが有効かを確認します。そのフォームで、その特定のヘルプ(HelpIDを使用)のソリューションをチェックボックスに表示します。私が提出したフォームを実行し、チェックボックスを押すと、データベースのHelpSolutionの値がからfalseに変更されます、私はそれが有効な解決策として選択されているためですもの)。

私はコントローラに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ですが、私はそれはかなり悪い書きました。私はこのことをどうやってやるべきかを知る必要があります。

+0

[ここ](http://www.entityframeworktutorial.net/EntityFramework4.3/update-one-to-manyentity-using-dbcontext.aspx)は、子コレクションを更新する方法の1つです。 –

答えて

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を変更するように設定していた問題を修正しました。