我正在使用.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" />
}
这些下拉列表中填充了已经存在于数据库中的用户和角色。它们允许我选择
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");
}
}
该动作从不向用户添加角色,并且异常读取“角色”管理“不存在”,没有内部异常。我试过将action参数中的
RoleName
转换为所有大写,但它仍然找不到角色。我还尝试使用角色id而不是名称,但也没有成功。当我使用identity 3.0和mvc 6构建这个应用程序时,这段代码起了作用。似乎在向身份核心转移的过程中发生了一些变化。
有什么想法吗?
编辑
下面是我通过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.cs中添加identity的
ConfigureServices
方法: 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");
}
最佳答案
我不能发表评论,问你,所以,你的错误说,用户管理不存在,或角色不存在?我试图复制你的代码在我的终端,如果用户不存在,你会得到一个“用户不能是空”的错误。但是,如果这个角色不存在,你将得到一个“角色[角色]不存在”的错误。
我假设您已经将角色添加到数据库中了?下面是我在seed方法中使用的一些代码,这些代码基本上实现了您想要的功能,但没有使用视图来实现它:
// 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");
}
编辑
您现在添加角色的方式将角色表中的normalizedname字段保留为空,我相信框架使用该字段向用户添加角色。尝试下列操作之一将角色添加到数据库,而不是当前正在执行的操作:
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");
}