编辑/修改数据时Viewbag IsValid为false

时间:2014-05-23 02:14:18

标签: asp.net-mvc-4

我试图在我的UserController中获取我的CompanyProfile ID 在第一步中我得到了正确的ID,但在[HttpPost]中,ID值变为与用户ID相同的值 这是我的控制器

public ActionResult Edit (int id)
{
User user = _db.Users.Find(id);
if ( user == null)
{
return HttpNotFound();
}
ViewBag.CompanyProfile = new SelectList(_db.CompanyProfiles,"ID","NamaProfil", user.CompanyProfile.ID);
return View(user);
}


[HttpPost]
public ActionResult Edit(User user)
{
if (ModelState.IsValid)
{
_db.Entry(user).State = EntityState.Modified;
_db.SaveChanges();
return RedirectToAction ("Index");
}
return View(user);
}

这是模型

public int ID {get;set;}
public virtual CompanyProfile CompanyProfile {get;set;}

这是编辑视图中的下拉列表

<div class= "controls">
@Html.DropDownList("CompanyProfile", null, "--Choose Company--", new {@class="span6 m-wrap"})
</div>

每个答案都有帮助,谢谢:D

忘了告诉这个,这是错误信息 没有类型&#39; IEnumerable&#39;的ViewData项目。有关键&#39; CompanyProfile&#39;。

1 个答案:

答案 0 :(得分:1)

这里有很多问题。您传递到视图的模型具有名为CompanyProfile的属性,其引用类型为CompanyProfile。此类型不能绑定到任何类型的IEnumerable - 这两个模型根本不匹配。您的模型属性必须是int类型,以匹配您传入的选定值 - user.CompanyProfile.ID。

第二个问题是,您永远不应将您的模型属性命名为与任何ViewBag值相同。您再次拥有一个名为CompanyProfile的属性,并且您有一个ViewBag.CompanyProfile。这两个将在模型绑定期间相互覆盖...

我建议您执行以下操作:在控制器中将选择列表绑定到ViewBag而不定义所选值:

ViewBag.CompanyProfileList = new SelectList(_db.CompanyProfiles,"ID","NamaProfil");

然后您的模型应该具有所选的公司资料ID属性:

public int CompanyProfileId { get; set; }

然后将其绑定在您的视图中:

@Html.DropDownListFor(m => m.CompanyProfileId, (SelectList)ViewBag.CompanyProfileList, "--Choose Company--", new { @class = "span6 m-wrap" })