这是视图中的表单,可让我选择一个用户并选择要添加的角色:
@using (HTML.BeginForm("AddRoletoUser","Roles")){ @HTML.AntiForgeryToken() @HTML.ValIDationSummary(true) <p> Username : @HTML.DropDownList("Username",(IEnumerable<SelectListItem>)VIEwBag.Users,"Select ...") Role name: @HTML.DropDownList("Rolename",(IEnumerable<SelectListItem>)VIEwBag.Roles,"Select ...") </p> <input type="submit" value="Save" />}
这些下拉列表中填充了数据库中已存在的用户和角色.它们允许我选择用户,以及我已经创建的角色的名称.例如,我有一个名为“admin”的角色,这个表单让我选择字符串“admin”.
这是处理向用户添加角色的 *** 作:
[httpPost] [ValIDateAntiForgeryToken] public async Task<IActionResult> AddRoletoUser(string Username,string Rolename) { try { ApplicationUser user = _db.Users.Where(u => u.Username.Equals(Username,StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault(); await _userManager.AddToRoleAsync(user,Rolename); PrepopulateDropDownMenus(); VIEwBag.ResultMessage = "Role created successfully!"; return VIEw("Manage","Roles"); } catch (Exception ex) { Console.Writeline(ex); return VIEw("Manage"); } }
该 *** 作永远不会将该角色添加到用户,并且该异常显示“Role”admin“不存在”.没有内在的例外.我已经尝试将action参数中的Rolename转换为all-caps,但它仍然找不到该角色.我也尝试使用角色ID而不是名称,这也是不成功的.
当我使用带有MVC 6的IDentity 3.0构建这个应用程序时,这个确切的代码工作.似乎有些东西在转移到IDentity Core时发生了变化.
有什么想法吗?
编辑
这是我用来通过VIEwbag填充RolesController中的下拉列表的代码:
private voID PrepopulateDropDownMenus() { var rolesList = _db.Roles.OrderBy(r => r.name).ToList().Select(rr => new SelectListItem { Value = rr.name.ToString(),Text = rr.name }).ToList(); var usersList = _db.Users.OrderBy(u => u.Username).ToList().Select(uu => new SelectListItem { Value = uu.Username.ToString(),Text = uu.Username }).ToList(); VIEwBag.Roles = rolesList; VIEwBag.Users = usersList; }
以下是我在ConfigureServices方法中在Startup.cs中添加IDentity的方法:
public voID ConfigureServices(IServiceCollection services) { ... services.AddEntityFramework() .AddDbContext<ApplicationDbContext>(options => options.UsesqlServer(Configuration["ConnectionStrings:DefaultConnection"])); services.AddIDentity<ApplicationUser,IDentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProvIDers(); }
这是RolesController.cs中的路由,用于在数据库中创建新角色:
[httpPost] public IActionResult Create(string rolename) { _db.Roles.Add(new IDentityRole() { name = rolename }); _db.SaveChanges(); VIEwBag.ResultMessage = "Role created successfully!"; return RedirectToAction("Index"); }解决方法 我还不能发表评论问你,那么,你的错误是说用户管理员不存在,还是角色不存在?我试图在我的最后复制你的代码,如果用户不存在,你将得到一个“用户不能为空”的错误.但是,如果该角色不存在,您将获得“角色[角色]不存在”错误.
我假设您已将角色添加到数据库中?以下是我在种子方法中使用的一些代码,基本上可以执行您想要的 *** 作,减去使用视图执行的 *** 作:
// Add the admin role to the database IDentityResult roleResult; bool adminRoleExists = await _roleManager.RoleExistsAsync("admin"); if (!adminRoleExists) { _logger.Loginformation("Adding admin role"); roleResult = await _roleManager.CreateAsync(new IDentityRole("admin")); } // Select the user,and then add the admin role to the user ApplicationUser user = await _userManager.FindBynameAsync("sysadmin"); if (!await _userManager.IsInRoleAsync(user,"admin")) { _logger.Loginformation("Adding sysadmin to admin role"); var userResult = await _userManager.AddToRoleAsync(user,"admin"); }
编辑
你现在添加角色的方式使Role表中的normalizedname字段为null,我认为框架用它来向用户添加角色.尝试以下 *** 作之一将角色添加到数据库而不是您当前正在执行的 *** 作:
var result = await _roleManager.CreateAsync(new IDentityRole(rolename));
或者这可能也有效(虽然没有测试过这个):
[httpPost]public IActionResult Create(string rolename){ _db.Roles.Add(new IDentityRole() { name = rolename,normalizedname = rolename.toupper() }); _db.SaveChanges(); VIEwBag.ResultMessage = "Role created successfully!"; return RedirectToAction("Index");}总结
以上是内存溢出为你收集整理的c# – userManager.AddToRoleAsync() – 错误:角色不存在全部内容,希望文章能够帮你解决c# – userManager.AddToRoleAsync() – 错误:角色不存在所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)