2016-04-21 37 views
1

私はStackOverflowを読んでいますが、実際にはこれを手助けすることはできませんでした。私はいくつかのモデルのフィールドのためのSelectListsを持っているポジションモデルに取り組んでいますが、試行して保存するたびにエラーが発生します:'CompanyID'というキーを持つ 'IEnumerable <SelectListItem>'タイプのViewDataアイテムはありません

"システムで 'System.InvalidOperationException' .Web.Mvc.dllでは処理されませんでしたが、ユーザーコードでは処理されませんでした。

追加情報: 'CompanyID'というキーを持つ 'IEnumerable'タイプのViewDataアイテムはありません。

ここに私の見解から該当するコードです:

コントローラ/ PositionController:

ビュー/ポジション/ Create.cshtml

<div class="form-group"> 
    <label class="control-label col-md-2">Company</label> 
    <div class="col-md-10"> 
     @Html.DropDownList("CompanyID", (SelectList)ViewBag.AllCompanies, new { @class = "form-control" }) 
    </div> 
</div> 

はここに私のコントローラから該当するコードです。 cs

 // GET: /Position/Create 
     public ActionResult Create() 
     { 
      //create query to find all committees 
      var query = from m in db.Majors 
         orderby m.Major 
         select m; 
      //execute query and store in list 
      List<Majors> allMajors = query.ToList(); 

      //convert list to select list format needed for HTML 
      SelectList allMajorsList = new SelectList(allMajors, "MajorID", "Major"); 

      ViewBag.AllMajors = allMajorsList; 

      //create query to find all committees 
      var query2 = from c in db.Companies 
         orderby c.CompanyName 
         select c; 
      //execute query and store in list 
      List<Company> allCompanies = query2.ToList(); 

      //convert list to select list format needed for HTML 
      SelectList allCompaniesList = new SelectList(allCompanies, "CompanyID", "CompanyName"); 

      ViewBag.AllCompanies = allCompaniesList; 

      //create query to find all committees 
      var query3 = from i in db.Industries 
         orderby i.IndustryName 
         select i; 
      //execute query and store in list 
      List<Industry> allIndustries = query3.ToList(); 

      //convert list to select list format needed for HTML 
      SelectList allIndustriesList = new SelectList(allIndustries, "IndustryID", "IndustryName"); 

      ViewBag.AllIndustries = allIndustriesList; 

      return View(); 
     } 

    // POST: /Position/Create 
    // 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 Create([Bind(Include="PositionID,PositionTitle,PositionType,PositionLocation,PositionDeadline,PositionDescription")] Position position, int[] SelectedMajors, Int32 CompanyID, Int32 IndustryID) 
    { 
     //find selected committee 
     Company SelectedCompany = db.Companies.Find(CompanyID); 
     Industry SelectedIndustry = db.Industries.Find(IndustryID); 

     //associate committee with event 
     position.PositionCompany = SelectedCompany; 
     position.PositionIndustry = SelectedIndustry; 

     if (ModelState.IsValid) 
     { 

      //if there are majors to add, add them 
      if (SelectedMajors != null) 
      { 
       foreach (int MajorId in SelectedMajors) 
       { 
        Majors majorToAdd = db.Majors.Find(MajorId); 
        position.ApplicableMajors.Add(majorToAdd); 
       } 
      } 

      db.Positions.Add(position); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(position); 
    } 

私が間違っていることを理解できないようです。どんな助けでも大歓迎です!

+0

にあなたのポストのアクションを変更

// GET: /Position/Create public ActionResult Create() { LoadViewBag(); return View(); } 

にあなたのGETアクションを変更します'ViewBag.AllCompanies'の名前を' ViewBag.CompanyID'に変更してください – DCruz22

+0

@ DCruz22ちょうど試しました - 同じエラーが発生しましたまたは:/ –

+0

強い形式のビューを使用しない理由は何ですか? – DCruz22

答えて

2

あなたの問題は... if (ModelState.IsValid)可能性が最も高い偽であるということであり、あなたがあなたのPOSTからのビューを返すときにViewBag値をリセットしていない...

ViewBag値がnullの場合は、ビューが探しますあなたのViewDataの何かがプロパティの名前と一致しているので、そのエラーが発生しています。 [HttpGet]アクション内のすべてのコードにコメントを付けてそこに戻るだけで、同じエラーが発生します。

あなたはプライベート無効にこのコードのすべてを移動してみなければならない。..

private void LoadViewBag() 
{ 
     //create query to find all committees 
     var query = from m in db.Majors 
        orderby m.Major 
        select m; 
     //execute query and store in list 
     List<Majors> allMajors = query.ToList(); 

     //convert list to select list format needed for HTML 
     SelectList allMajorsList = new SelectList(allMajors, "MajorID", "Major"); 

     ViewBag.AllMajors = allMajorsList; 

     //create query to find all committees 
     var query2 = from c in db.Companies 
        orderby c.CompanyName 
        select c; 
     //execute query and store in list 
     List<Company> allCompanies = query2.ToList(); 

     //convert list to select list format needed for HTML 
     SelectList allCompaniesList = new SelectList(allCompanies, "CompanyID", "CompanyName"); 

     ViewBag.AllCompanies = allCompaniesList; 

     //create query to find all committees 
     var query3 = from i in db.Industries 
        orderby i.IndustryName 
        select i; 
     //execute query and store in list 
     List<Industry> allIndustries = query3.ToList(); 

     //convert list to select list format needed for HTML 
     SelectList allIndustriesList = new SelectList(allIndustries, "IndustryID", "IndustryName"); 

     ViewBag.AllIndustries = allIndustriesList; 
} 

は、次に次に

// POST: /Position/Create 
// 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 Create([Bind(Include="PositionID,PositionTitle,PositionType,PositionLocation,PositionDeadline,PositionDescription")] Position position, int[] SelectedMajors, Int32 CompanyID, Int32 IndustryID) 
{ 
    //find selected committee 
    Company SelectedCompany = db.Companies.Find(CompanyID); 
    Industry SelectedIndustry = db.Industries.Find(IndustryID); 

    //associate committee with event 
    position.PositionCompany = SelectedCompany; 
    position.PositionIndustry = SelectedIndustry; 

    if (ModelState.IsValid) 
    { 

     //if there are majors to add, add them 
     if (SelectedMajors != null) 
     { 
      foreach (int MajorId in SelectedMajors) 
      { 
       Majors majorToAdd = db.Majors.Find(MajorId); 
       position.ApplicableMajors.Add(majorToAdd); 
      } 
     } 

     db.Positions.Add(position); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    LoadViewBag(); 
    return View(position); 
} 
関連する問題