2016-04-21 32 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); 
} 
相关问题