.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를 사용하여 시도했다.
이 정확한 코드는 Identity 3.0 MVC 6을 사용하여이 응용 프로그램을 만들 때 작동했습니다. Identity Core로 이전 할 때 뭔가가 변경된 것처럼 보입니다.
의견이 있으십니까? 나는에 에 Startup.cs을 신원을 추가하는 방법은 다음과
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;
}
것 :
편집 여기
는 Viewbag 통해 RolesController
에서 내가 드롭 다운 목록을 채우는 데 사용하고 코드입니다 ConfigureServices
방법 :
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFramework()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["ConnectionStrings:DefaultConnection"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
다음은 경로입니다. 나는 아직 의견을 게시 할 수 없습니다 물어, 그래서
[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