C# 使用IEnumerable SelectList的下拉菜单

C# 使用IEnumerable SelectList的下拉菜单,c#,html,asp.net,asp.net-mvc,C#,Html,Asp.net,Asp.net Mvc,当我试图从下拉列表中选择一个项目并提交此项目时,出现以下错误 中发生“System.InvalidOperationException”类型的异常 System.Web.Mvc.dll,但未在用户代码中处理 信息:没有类型为的ViewData项 具有键“RoleName”的“IEnumerable” 如果有人能帮我找出如何修复这个错误,我会非常感激,因为我还没有能够修复它,并且已经被困了很长时间,而谷歌还没有提供解决方案 这是我的控制器代码 [AllowAnonymous] pu

当我试图从下拉列表中选择一个项目并提交此项目时,出现以下错误

中发生“System.InvalidOperationException”类型的异常 System.Web.Mvc.dll,但未在用户代码中处理 信息:没有类型为的ViewData项 具有键“RoleName”的“IEnumerable”

如果有人能帮我找出如何修复这个错误,我会非常感激,因为我还没有能够修复它,并且已经被困了很长时间,而谷歌还没有提供解决方案

这是我的控制器代码

    [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 />
@{
ViewBag.Title=“ManageUserRoles”;
}
管理用户角色
@Html.ActionLink(“创建新角色”、“创建”)|@Html.ActionLink(“查看用户角色”、“索引”)

角色添加到用户 @使用(Html.BeginForm(“RoleAddToUser”、“Roles”)) { @Html.AntiForgeryToken() @Html.ValidationSummary(true) 用户名:@Html.TextBox(“用户名”) 角色名称:@Html.DropDownList(“RoleName”,(IEnumerable)ViewBag.Roles,“选择…”)

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

问题是(我假设)您是从ActionResult RoleAddToUser而不是从ManageUserRoles访问视图(“ManageUserRoles”)。因此ViewBag不存在

return View("ManageUserRoles");
开始渲染视图。但是在视图上,您有一个下拉列表,它需要ViewBag.Roles。。。但是在哪里设置数据?引发此异常是因为ViewBag.Roles不存在

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

return RedirectToAction("ManageUserRoles");

如果希望在该方法中呈现视图而不执行代码,则必须在RoleAddToUser中创建ViewBag.Roles。请注意,每次请求后都会删除ViewBag数据

我已经检查了我的模型,该字段名为Name而不是RoleName,但是在将RoleName的所有引用更改为Name之后,我仍然收到相同的错误,您在哪里将角色添加到ViewBag?这就解决了问题,非常感谢您的帮助@Ademar