2016-09-15 144 views
3

我正在使用.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"); 
    } 

回答

10

我不能發表評論問你,所以,你不說錯誤用戶管理不存在,或角色不存在?我試圖複製你的代碼,如果用戶不存在,你會得到一個「用戶不能爲空」的錯誤。但是,如果角色不存在,則會得到「角色[角色]不存在」錯誤。

我認爲你已經添加到你的數據庫中的角色?下面是一些代碼我在種子的方法使用,基本上你想要做什麼,減去使用的意見,做到這一點:

 // 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"); 
} 
+0

謝謝抓住那個!錯誤說「角色[角色]不存在」。我編輯了我的問題。我已經將該角色添加到了我的數據庫中(下拉列表中填充了「角色」表中的數據)。您的答案中包含的代碼是否適合您? – jmk22

+0

是的,這是我用來創建一個新的/空的數據庫的實際代碼,但基礎應該是相同的。你能發佈填充你的選擇列表的代碼嗎?你如何將角色添加到數據庫中? – FranksBrain

+0

這很有趣。我在上面的編輯中添加了代碼。我使用數據庫的「Add」方法在控制器的「Create」操作中將角色添加到數據庫中。 – jmk22