2016-04-21 67 views
1

我一直在閱讀StackOverflow,但是沒有人真正能夠幫助我。我工作的有來自其他幾個車型領域SelectLists位置的模式,但每一次我嘗試和節省時間,我得到的錯誤:沒有類型爲'IEnumerable <SelectListItem>'的ViewData項目,其中包含關鍵字'CompanyID'

「的‘System.InvalidOperationException’類型的異常出現在系統.Web.Mvc.dll但在用戶代碼中沒有處理

附加信息:有型「的IEnumerable」具有關鍵「CompanyID」沒有ViewData的項目」

下面是從我的觀點的相關代碼:

查看/位置/ 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> 

下面是從我的控制器相關代碼:

控制器/ PositionController。 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

將'ViewBag.AllCompanies'的名稱更改爲'ViewBag.CompanyID' – DCruz22

+0

@ DCruz22剛試過 - 得到相同的錯誤或:/ –

+0

爲什麼不使用強類型視圖? – DCruz22

回答

2

您的問題是if (ModelState.IsValid)是最有可能假的..而當你從POST返回查看你不進行重置ViewBag值..

如果ViewBag值爲空,那麼該視圖將尋找您的ViewData中的某些內容與該屬性的名稱相匹配,這就是您遇到此錯誤的原因。如果你在[HttpGet]操作中註釋了所有的代碼,並在那裏返回View,你將會得到相同的錯誤。

你應該嘗試所有這些代碼移動到一個私人無效..

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

那麼你的GET操作改變

// GET: /Position/Create 
    public ActionResult Create() 
    { 

     LoadViewBag(); 
     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"); 
    } 

    LoadViewBag(); 
    return View(position); 
} 
相關問題