Pada pendaftaran semua pengguna ditambahkan ke peran umum. Bagaimana admin dapat memperbarui atau mengubah peran pengguna untuk memberi mereka lebih banyak hak istimewa.

Memperbarui peran adalah masalahnya sekarang Ada apa yang telah saya lakukan sejauh ini EditRole Model

    public class EditRole
    {
        public EditRole()
        {
            Users = new List<string>();
        }
        public string Id { get; set; }
        [Required(ErrorMessage = "Role Name is Required")]
        public string RoleName { get; set; }
        public List<string>Users { get; set; }
    }

Dalam tampilan, saya sudah meneruskan ID peran ke Url, saya juga bisa mendapatkan daftar pengguna, lalu pilih pengguna yang ingin saya perbarui dari dropdown. Saya berpikir karena saya memiliki id Peran, saya dapat menanyakan dengan UserManager dan menetapkan Pengguna yang dipilih ke Peran.

@model LoanWarehouse.Repo.Models.EditRole

<div class="container" style="margin-top: 100px">
    <div class="row">
        <div class="col-md-6">
            <h2>Please select user and the role you want to assign</h2>
            <form asp-action="Assign" >
                <div class="dropdown">
                    <select asp-for="Users" id="roles" class="form-control">
                        <option>Select User</option>
                        @foreach (var user in Model.Users)
                        {
                            <option asp-for="Users">@user</option>
                        }
                    </select>
                </div>
                <div class="form-group has-feedback">
                    <input type="hidden" asp-for="@Model.Id" class="form-control" placeholder="Role">
                    <span asp-validation-for="Id" class="help-block"></span>
                </div>
                @*<td><a class="btn btn-warning btn-sm" asp-controller="Admin" asp-action="EditRole" asp-route-id="@role.Id">Edit</a></td>*@

                <button type="submit"  class="btn btn-success" >Assign User to role</button>
            </form>

        </div>
    </div>
</div>

Ini pengontrolnya

  [HttpPost]
        public async Task<IActionResult> Assign(string id, EditRole model)
        {
            try
            {
              var role = roleManager.FindByIdAsync(model.Id);//find passed in role id
           var currentRole = roleManager.FindByNameAsync(model.Users[0]);//find the role of current user
            var user = await userManager.FindByNameAsync(model.Users[0]);

                if (role == null)
                {
                    ViewBag.ErrorMessage = $"Role with Id = {id} cannot be found";
                    return RedirectToAction("ListRoles", "Admin");
                }
                else
                {
                   await userManager.RemoveFromRoleAsync(user, currentRole.Result.Name);
                   await userManager.AddToRoleAsync(user, role.Result.Name);
                   return RedirectToAction("ListRoles", "Admin");
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }

        }

Sepertinya saya tidak bisa membuatnya bekerja Adakah yang bisa membantu?

1
techstack 27 Maret 2020, 15:02

1 menjawab

Jawaban Terbaik

Dalam kode Anda, Anda menggunakan Metode RoleManager.FindByNameAsync(String) untuk menemukan peran pengguna saat ini, dan Anda memberikan nama pengguna (bukan nama peran), yang menyebabkan masalah.

var currentRole = roleManager.FindByNameAsync(model.Users[0]);

Untuk memperbaikinya, Anda dapat menggunakan Metode UserManager.GetRolesAsync(TUser) untuk mendapatkan nama peran yang dimiliki pengguna tertentu, seperti di bawah ini.

var role = await roleManager.FindByIdAsync(model.Id);
var user = await userManager.FindByNameAsync(model.Users[0]);

//find the role(s) of current user
var currentRoles = await userManager.GetRolesAsync(user);

// ...
//your code logic here

await userManager.RemoveFromRolesAsync(user, currentRoles);

//...
0
Fei Han 30 Maret 2020, 07:34