From 6490c42a9d72a6fa817c86b9ebefa3f9e159202e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Kub=C3=AD=C4=8Dek?= Date: Fri, 1 May 2026 20:16:08 +0200 Subject: [PATCH] Added role management functionality to the user details page --- .../Admin/Controllers/UsersController.cs | 26 ++++++++++++++-- .../Areas/Admin/Views/Users/Details.cshtml | 30 ++++++++++++++++++- .../Models/UserWithRolesViewModel.cs | 1 + 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/Template/TemplateWeb/Areas/Admin/Controllers/UsersController.cs b/Template/TemplateWeb/Areas/Admin/Controllers/UsersController.cs index 64999c4..57a65c9 100644 --- a/Template/TemplateWeb/Areas/Admin/Controllers/UsersController.cs +++ b/Template/TemplateWeb/Areas/Admin/Controllers/UsersController.cs @@ -8,20 +8,23 @@ namespace TemplateWeb.Areas.Admin.Controllers; public class UsersController : AdminBaseController { private readonly UserManager _userManager; + private readonly RoleManager _roleManager; - public UsersController(UserManager userManager) + public UsersController(UserManager userManager, RoleManager roleManager) { _userManager = userManager; + _roleManager = roleManager; } public async Task Index() { + var allRoles = _roleManager.Roles.Select(r => r.Name!).ToList(); var users = _userManager.Users.ToList(); var viewModels = new List(); foreach (var user in users) { var roles = await _userManager.GetRolesAsync(user); - viewModels.Add(new UserWithRolesViewModel { UserEntity = user, Roles = roles }); + viewModels.Add(new UserWithRolesViewModel { UserEntity = user, Roles = roles, AllRoles = allRoles }); } return View(viewModels); } @@ -32,6 +35,23 @@ public class UsersController : AdminBaseController if (user == null) return NotFound(); var roles = await _userManager.GetRolesAsync(user); - return View(new UserWithRolesViewModel { UserEntity = user, Roles = roles }); + var allRoles = _roleManager.Roles.Select(r => r.Name!).ToList(); + return View(new UserWithRolesViewModel { UserEntity = user, Roles = roles, AllRoles = allRoles }); + } + + [HttpPost] + [ValidateAntiForgeryToken] + public async Task UpdateRoles(string id, List selectedRoles) + { + var user = await _userManager.FindByIdAsync(id); + if (user == null) return NotFound(); + + var currentRoles = await _userManager.GetRolesAsync(user); + await _userManager.RemoveFromRolesAsync(user, currentRoles); + if (selectedRoles.Count > 0) + await _userManager.AddToRolesAsync(user, selectedRoles); + + TempData["SuccessMessage"] = "Roles updated successfully."; + return RedirectToAction(nameof(Details), new { id }); } } diff --git a/Template/TemplateWeb/Areas/Admin/Views/Users/Details.cshtml b/Template/TemplateWeb/Areas/Admin/Views/Users/Details.cshtml index f246174..94de750 100644 --- a/Template/TemplateWeb/Areas/Admin/Views/Users/Details.cshtml +++ b/Template/TemplateWeb/Areas/Admin/Views/Users/Details.cshtml @@ -7,7 +7,12 @@ ← Back to List -
+@if (TempData["SuccessMessage"] != null) +{ +
@TempData["SuccessMessage"]
+} + +

User Information: @Model.UserEntity.UserName

@@ -32,3 +37,26 @@
+ +
+
+
Edit Roles
+
+
+
+ @Html.AntiForgeryToken() +
+ @foreach (var role in Model.AllRoles) + { +
+ + +
+ } +
+ +
+
+
diff --git a/Template/TemplateWeb/Models/UserWithRolesViewModel.cs b/Template/TemplateWeb/Models/UserWithRolesViewModel.cs index d4d50d6..c20f738 100644 --- a/Template/TemplateWeb/Models/UserWithRolesViewModel.cs +++ b/Template/TemplateWeb/Models/UserWithRolesViewModel.cs @@ -6,4 +6,5 @@ public class UserWithRolesViewModel { public UserEntity UserEntity { get; set; } = null!; public IList Roles { get; set; } = []; + public IList AllRoles { get; set; } = []; }