Rollarni tahrirlash Foydalanuvchilarni avtorizatsiya qilish uchun rollarni yaratish va o‘chirishning o‘zi yetarli emas. Shuningdek, rollarni boshqarish, foydalanuvchilarga rolni tayinlash va roldan olib tashlash imkoniyati ham bo‘lishi kerak. Bu murakkab jarayon emas, lekin uni amalga oshirish uchun AppRoleManagerklassidan foydalanib, rol ma’lumotlarini yuklash kerak, keyin AppUserManager klassi obyektida aniqlangan metodlarni chaqirish kerak.
UserViewModels.cs fayliga yangi View-model klasslarini qo‘shishamiz:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
{
public AppRole Role { get; set; }
public IEnumerable Members { get; set; }
public IEnumerable NonMembers { get; set; }
}
public class RoleModificationModel
{
[Required]
public string RoleName { get; set; }
public string[] IdsToAdd { get; set; }
public string[] IdsToDelete { get; set; }
}
}
RolEditModel klassi rollar to‘g‘risidagi ma’lumotlarni o‘z ichiga oladi, hamda AppUser obyektlari ro‘yxati sifatida roldagi foydalanuvchilar ro‘yxatini qaytaradi. Buning yordamida roldagi har bir foydalanuvchi identifikatorini va nomini olish mumkin. Foydalanuvchi ma’lumotlarini tahrirlash paytida RoleModificationModel klassi ma’lumotlar bazasi tizimidan ma’lumotlarni oladi. U rollarni almashtirish uchun AppUser obyektlarini emas, balki foydalanuvchi identifikatorlarining ro‘yxatini o‘z ichiga oladi.
Model klasslarini aniqlagandan so‘ng, RoleAdmin controller-ga Edit roli metodlarini qo‘shamiz:
using System.Web;
using System.Web.Mvc;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using System.ComponentModel.DataAnnotations;
using Users.Infrastructure;
using Users.Models;
using System.Linq;
using System.Collections.Generic;
namespace Users.Controllers
{
public class RoleAdminController : Controller
{
//...
{
Role = role,
Members = members,
NonMembers = nonMembers
});
}
[HttpPost]
public async Task Edit(RoleModificationModel model)
{
IdentityResult result;
if (ModelState.IsValid)
{
foreach (string userId in model.IdsToAdd ?? new string[] { })
{
result = await UserManager.AddToRoleAsync(userId, model.RoleName);
if (!result.Succeeded)
{
return View("Error", result.Errors);
}
}
foreach (string userId in model.IdsToDelete ?? new string[] { })
{
result = await UserManager.RemoveFromRoleAsync(userId,
model.RoleName);
if (!result.Succeeded)
{
return View("Error", result.Errors);
}
}
return RedirectToAction("Index");
}
return View("Error", new string[] { "Rol topilmadi." });
}
}
}
Edit metodining GET versiyasidagi kodning asosiy qismi rolda bo‘lgan va rolda bo‘lmagan foydalanuvchilar ro‘yxatini tuzishga javobgar. Foydalanuvchilar guruhlanganidan keyin View qaytariladi, unga parameter sifatida RolEditModel obyekti uzatiladi.
Edit metodining POST versiyasi foydalanuvchilarni rollarga qo‘shish va undan o‘chirish uchun javobgar. AppUserManager klassi UserManager klassidagi rollar bilan ishlash uchun bir qator yordamchi metodlarni voris qilib oladi. Ushbu metodlar quyidagi jadvalda keltirilgan.
Nomi
Tavsifi
AddToRoleAsync(id, name)
Id identifikatorli foydalanuvchini name nomli rolga biriktiradi
GetRolesAsync(id)
Id identifikatorli foydalanuvchi rollari ro‘yxatini qaytaradi
IsInRoleAsync(id, name)
True, agar Id identifikatorli foydalanuvchini name nomli rolga ega bo‘lsa
RemoveFromRoleAsync(id, name)
Id identifikatorli foydalanuvchini name nomli roldan o‘chirish
Quyidagi misolda “/Views/RoleAdmin.cshtml” papkasida joylashgan Edit.cshtml View uchun kod ko‘rsatilgan: