我正在使用.NET Core,Identity Core和MVC Core创建用户注册系统。我能够创建用户并在数据库中创建角色。userManager.AddToRoleAsync() - 错误:角色不存在
下面是关于视图的形式,让我选择一个用户,然后选择一个角色添加:
@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" />
}
这些下拉列表中填充与已经存在于数据库中的用户和角色。他们允许我选择User
s和名称我已经创建的角色。例如,我有一个名为“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");
}
}
的行动从未添加角色给用户,异常写着’角色” ADMIN没有内在的例外。我尝试将动作参数中的RoleName
转换为全部大写,但它仍未找到角色。我也尝试使用角色ID而不是名称,这也是不成功的。
当我使用Identity 3.0与MVC 6构建此应用程序时,此确切代码有效。似乎在向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;
}
以下是我在添加身份Startup.csConfigureServices
方法:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFramework()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
这里是路线i ñ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");
}
谢谢抓住那个!错误说“角色[角色]不存在”。我编辑了我的问题。我已经将该角色添加到了我的数据库中(下拉列表中填充了“角色”表中的数据)。您的答案中包含的代码是否适合您? – jmk22
是的,这是我用来创建一个新的/空的数据库的实际代码,但基础应该是相同的。你能发布填充你的选择列表的代码吗?你如何将角色添加到数据库中? – FranksBrain
这很有趣。我在上面的编辑中添加了代码。我使用数据库的“Add”方法在控制器的“Create”操作中将角色添加到数据库中。 – jmk22