我正在使用.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