使用IEnumerable SelectList的DropDown菜单

时间:2015-12-21 16:05:30

标签: c# html asp.net asp.net-mvc

尝试从我的下拉列表中选择一个项目并提交时,我收到以下错误。

  

类型' System.InvalidOperationException'的例外情况发生在   System.Web.Mvc.dll但未在用户代码中处理   信息:没有类型的ViewData项   ' IEnumerable的'具有密钥' 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 />

2 个答案:

答案 0 :(得分:0)

验证您的模型(无论是域模型还是其他视图模型)是否具有名为“RoleName”的字符串类型字段,这需要匹配DropDownList调用的第一个参数,以便页面知道要发布数据的变量回到表格提交。

答案 1 :(得分:0)

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

return View("ManageUserRoles");

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

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

return RedirectToAction("ManageUserRoles");

如果您想要在该方法中没有执行代码的渲染视图,则必须在RoleAddToUser中创建ViewBag.Roles。请注意,每次请求后都会删除ViewBag数据。