2015-12-21 47 views
0

尝试从我的下拉列表中选择一个项目并提交时出现以下错误。使用IEnumerable SelectList的DropDown菜单

“System.InvalidOperationException”类型发生在 System.Web.Mvc.dll程序,但在用户代码附加 信息没有处理的例外:有是有型 “IEnumerable的”无ViewData的项目键'RoleName'。

如果有人可以帮助我弄清楚如何解决这个错误,我真的很感激它,因为我一直没能解决它尚未被并为停留相当长的时间,谷歌还没有提供解决方案然而!

这是我的控制器代码

[AllowAnonymous] 
    public ActionResult Index() 
    { 
     var roles = context.Roles.ToList(); 

     return View(roles); 
    } 

    [Authorize(Roles = "canEdit")] 
    public ActionResult ManageUserRoles() 
    { 
     var list = context. 
      Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList(); 
     ViewBag.Roles = list; 
     return View(); 
    } 

    public ActionResult RoleAddToUser(string UserName, string RoleName) 
    { 
     ApplicationUser user = context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)); 
     if (user != null) 
     { 
      UserManager.AddToRole(user.Id, RoleName); 
     } 
     return View("ManageUserRoles"); 
    } 

这是我ManageUserRoles查看

@{ 
ViewBag.Title = "ManageUserRoles"; 
} 


<h2>Manage User Roles</h2> 
@Html.ActionLink("Create New Role", "Create") | @Html.ActionLink("View User Roles", "Index") 
<hr /> 

<h2>Role Add to User</h2> 

@using (Html.BeginForm("RoleAddToUser", "Roles")) 
{ 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

<p> 
    User Name : @Html.TextBox("UserName") 
    Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>) ViewBag.Roles, "Select ...") 
</p> 

<input type="submit" value="Save" /> 
} 
<hr /> 
+0

你在哪里添加角色到ViewBag? – tcrite

回答

0

问题是(我假设)您正在从您的ActionResult RoleAddToUser而不是ManageUserRoles访问View(“ManageUserRoles”)。所以ViewBag不存在。

return View("ManageUserRoles"); 

开始渲染视图。然而,在视图中,您需要ViewBag.Roles的下拉列表...但是...您在哪里设置数据?抛出此异常是因为ViewBag.Roles不存在。

如果要在返回视图之前运行ActionResult ManageUserRoles,则必须调用重定向。

return RedirectToAction("ManageUserRoles"); 

如果你想渲染视图,而不在该方法中执行代码,你必须创建在RoleAddToUser ViewBag.Roles。请注意,ViewBag数据在每次请求后都会被删除。

+0

非常感谢您的帮助@Ademar – LucyJane

0

验证模型(它的域模型或其他一些视图模型是否)有字符串类型的字段名为“RoleName”,这需要匹配DropDownList调用的第一个参数,以便页面知道在表单提交中将数据发回的变量。

+0

我检查了我的模型,并且该字段被称为Name而不是RoleName,但是在将RoleName的所有引用更改为Name之后,我仍然得到相同的错误 – LucyJane