.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
を選択することを可能にし、という名前は既に私が作成した役割のです。たとえば、私は "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を使用しようとしましたが、失敗しました。
この正確なコードは、アイデンティティ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中でアイデンティティを追加する方法ですが、 ConfigureServices
方法:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFramework()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
ここでは経路i nは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