c# – userManager.AddToRoleAsync() – 错误:角色不存在

c# – userManager.AddToRoleAsync() – 错误:角色不存在,第1张

概述我正在使用.NET Core,Identity Core和MVC Core创建用户注册系统.我能够在数据库中创建用户并创建角色. 这是视图中的表单,可让我选择一个用户并选择要添加的角色: @using (Html.BeginForm("AddRoleToUser", "Roles")){ @Html.AntiForgeryToken() @Html.ValidationSumma 我正在使用.NET Core,IDentity Core和MVC Core创建用户注册系统.我能够在数据库中创建用户并创建角色.

这是视图中的表单,可让我选择一个用户并选择要添加的角色:

@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() – 错误:角色不存在所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1259751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存