Я создаю систему регистрации пользователей с использованием .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
в параметры действия в all-caps, но он все еще не находит эту роль. Я также попытался использовать идентификатор роли вместо имени, что также не увенчалось успехом.
Этот точный код работал, когда я создал это приложение с помощью Identity 3.0 с MVC 6. Кажется, что что-то изменилось при переходе к Identity Core.
Любые мысли?
Редактировать
Вот код, я использую для заполнения выпадающих списков в RolesController
через Viewbag:
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 в ConfigureServices
:
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
это интересно. Я добавил код в приведенное выше изменение. Я добавляю роль в базу данных в действие «Создать» в контроллере с помощью метода «Добавить» для базы данных. – jmk22