ASP.NET Core Identity + Mysql(实战四)——角色管理

简单效果展示
EditRole
1.在controller中建立RoleController.cs

using LibrarySystem.Web.Models;
using LibrarySystem.Web.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace LibrarySystem.Web.Controllers
{
    [Authorize]
    public class RoleController : Controller
    {
        private readonly UserManager<Student> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;

        public RoleManager<IdentityRole> RoleManager => _roleManager;

        public RoleController(
            UserManager<Student> userManager,
            RoleManager<IdentityRole> roleManager)
        {
            _userManager = userManager;
            _roleManager = roleManager;
        }

        public async Task<IActionResult> Index()
        {
            var roles = await RoleManager.Roles.ToListAsync();
            return View(roles);
        }

        //添加角色
        public IActionResult AddRole()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> AddRole(RoleAddViewModel roleAddViewModel)
        {
            if (!ModelState.IsValid)
            {
                return View(roleAddViewModel);
            }

            var role = new IdentityRole
            {
                Name = roleAddViewModel.RoleName
            };

            var result = await RoleManager.CreateAsync(role);
            if (result.Succeeded)
            {
                return RedirectToAction("Index");
            }

            foreach (var error in result.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }
            return View(roleAddViewModel);
        }

        //管理角色
        public async Task<IActionResult> EditRole(string id)
        {
            var role = await RoleManager.FindByIdAsync(id);

            if (role == null)
            {
                return RedirectToAction("Index");
            }

            var roleEditViewModel = new RoleEditViewModel
            {
                Id = id,
                RoleName = role.Name,
                Users = new List<string>()
            };

            var users = await _userManager.Users.ToListAsync();
            foreach (var user in users)
            {
                if (await _userManager.IsInRoleAsync(user, role.Name))
                {
                    roleEditViewModel.Users.Add(user.UserName);
                }
            }

            return View(roleEditViewModel);
        }

        [HttpPost]
        public async Task<IActionResult> EditRole(RoleEditViewModel roleEditViewModel)
        {
            var role = await RoleManager.FindByIdAsync(roleEditViewModel.Id);

            if (role != null)
            {
                role.Name = roleEditViewModel.RoleName;

                var result = await RoleManager.UpdateAsync(role);

                if (result.Succeeded)
                {
                    return RedirectToAction("Index");
                }

                ModelState.AddModelError(string.Empty, "更新角色时出错");

                return View(roleEditViewModel);
            }

            return RedirectToAction("Index");
        }

        //删除角色
        [HttpPost]
        public async Task<IActionResult> DeleteRole(string id)
        {
            var role = await RoleManager.FindByIdAsync(id);
            if (role != null)
            {
                var result = await RoleManager.DeleteAsync(role);
                if (result.Succeeded)
                {
                    return RedirectToAction("Index");
                }
                ModelState.AddModelError(string.Empty, "删除角色时出错");
            }
            ModelState.AddModelError(string.Empty, "没找到该角色");
            return View("Index", await RoleManager.Roles.ToListAsync());
        }

        //给用户添加角色
        public async Task<IActionResult> AddUserToRole(string roleId)
        {
            var role = await RoleManager.FindByIdAsync(roleId);

            if (role == null)
            {
                return RedirectToAction("Index");
            }

            var vm = new UserRoleViewModel
            {
                RoleId = role.Id
            };

            var users = await _userManager.Users.ToListAsync();

            foreach (var user in users)
            {
                if (!await _userManager.IsInRoleAsync(user, role.Name))
                {
                    vm.Users.Add(user);
                }
            }

            return View(vm);

        }

        [HttpPost]
        public async Task<IActionResult> AddUserToRole(UserRoleViewModel userRoleViewModel)
        {
            var user = await _userManager.FindByIdAsync(userRoleViewModel.UserId);
            var role = await RoleManager.FindByIdAsync(userRoleViewModel.RoleId);

            if (user != null && role != null)
            {
                var result = await _userManager.AddToRoleAsync(user, role.Name);

                if (result.Succeeded)
                {
                    return RedirectToAction("EditRole", new { id = role.Id });
                }

                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
                return View(userRoleViewModel);
            }

            ModelState.AddModelError(string.Empty, "用户或角色未找到");
            return View(userRoleViewModel);
        }

        //删除用户角色
        public async Task<IActionResult> DeleteUserFromRole(string roleId)
        {
            var role = await RoleManager.FindByIdAsync(roleId);

            if (role == null)
            {
                return RedirectToAction("Index");
            }

            var vm = new UserRoleViewModel
            {
                RoleId = role.Id
            };

            var users = await _userManager.Users.ToListAsync();

            foreach (var user in users)
            {
                if (await _userManager.IsInRoleAsync(user, role.Name))
                {
                    vm.Users.Add(user);
                }
            }

            return View(vm);

        }

        [HttpPost]
        public async Task<IActionResult> DeleteUserFromRole(UserRoleViewModel userRoleViewModel)
        {
            var user = await _userManager.FindByIdAsync(userRoleViewModel.UserId);
            var role = await RoleManager.FindByIdAsync(userRoleViewModel.RoleId);

            if (user != null && role != null)
            {
                if (await _userManager.IsInRoleAsync(user, role.Name))
                {
                    var result = await _userManager.RemoveFromRoleAsync(user, role.Name);

                    if (result.Succeeded)
                    {
                        return RedirectToAction("EditRole", new { id = role.Id });
                    }

                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError(string.Empty, error.Description);
                    }
                    return View(userRoleViewModel);
                }

                ModelState.AddModelError(string.Empty, "用户不在角色里");
                return View(userRoleViewModel);
            }

            ModelState.AddModelError(string.Empty, "用户或角色未找到");
            return View(userRoleViewModel);
        }
    }
}

2.在ViewModel中依次新建RoleAddViewModel.cs、RoleEditViewModel.cs、UserRoleViewModel.cs

using System.ComponentModel.DataAnnotations;

namespace LibrarySystem.Web.ViewModels
{
    public class RoleAddViewModel
    {
        [Required]
        [Display(Name = "角色名称")]
        public string RoleName { get; set; }
    }
}
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace LibrarySystem.Web.ViewModels
{
    public class RoleEditViewModel
    {
        public string Id { get; set; }

        [Required]
        [Display(Name = "角色名称")]
        public string RoleName { get; set; }

        public List<string> Users { get; set; }
    }
}
using Microsoft.AspNetCore.Identity;
using System.Collections.Generic;

namespace LibrarySystem.Web.ViewModels
{
    public class UserRoleViewModel
    {
        public UserRoleViewModel()
        {
            Users = new List<IdentityUser>();
        }

        public string UserId { get; set; }
        public string RoleId { get; set; }

        public List<IdentityUser> Users { get; set; }
    }
}

3.在Views中新建Role文件夹,在文件夹中添加需要的视图
(1)Index.cshtml

@model IEnumerable<Microsoft.AspNetCore.Identity.IdentityRole>

@{
    ViewBag.Title = "角色列表";
}

<h2>@ViewBag.Title</h2>

<table class="table">
    <thead class="thead-dark">
    <tr>
        <th scope="col">角色ID</th>
        <th scope="col">角色名</th>
        <th scope="col">操作</th>
    </tr>
    </thead>
    <tbody>
    @foreach (var r in Model)
    {
        <tr>
            <th scope="row">@r.Id</th>
            <td>@r.Name</td>
            <td>
                <form asp-action="DeleteRole" asp-route-id="@r.Id" method="post">
                    <a asp-action="EditRole" asp-route-id="@r.Id" class="btn btn-primary">编辑</a>
                    <button type="submit" class="btn btn-danger"
                            onclick="return confirm('确认删除?')">
                        删除
                    </button>
                </form>
            </td>
        </tr>
    }
    </tbody>
</table>

<a asp-action="AddRole" class="btn btn-primary">添加角色</a>

(2)AddRole.cshtml

@model RoleAddViewModel

@{
    ViewBag.Title = "添加角色";
}

<h2>@ViewBag.Title</h2>

<form method="post">
    <div class="form-group row">
        <label asp-for="RoleName" class="col-sm-2"></label>
        <div class="col-sm-10">
            <input class="form-control" asp-for="RoleName">
            <span class="invalid" asp-validation-for="RoleName"></span>
        </div>
    </div>

    <div class="invalid" asp-validation-summary="ModelOnly">
    </div>

    <button type="submit" class="btn btn-primary">提交</button>
    <a asp-action="Index" class="btn btn-secondary">返回列表</a>
</form>

(3)EditRole.cshtml

@model RoleEditViewModel

@{
    ViewBag.Title = "编辑角色";
}

<h2>@ViewBag.Title</h2>

<form method="post">

    <div class="form-group row">
        <label asp-for="Id" class="col-sm-2"></label>
        <div class="col-sm-10">
            <input class="form-control" asp-for="Id" readonly>
            <span class="invalid" asp-validation-for="Id"></span>
        </div>
    </div>

    <div class="form-group row">
        <label asp-for="RoleName" class="col-sm-2"></label>
        <div class="col-sm-10">
            <input class="form-control" asp-for="RoleName">
            <span class="invalid" asp-validation-for="RoleName"></span>
        </div>
    </div>

    <div class="invalid" asp-validation-summary="ModelOnly">
    </div>

    <button type="submit" class="btn btn-primary">保存</button>
    <a asp-action="Index" class="btn btn-secondary">返回列表</a>
</form>

<hr />

<h3>角色的用户</h3>
<ul>
    @foreach (var user in Model.Users)
    {
        <li>@user</li>
    }
</ul>

<a asp-action="AddUserToRole" asp-route-roleId="@Model.Id" class="btn btn-primary">
    为角色添加用户
</a>
<a asp-action="DeleteUserFromRole" asp-route-roleId="@Model.Id" class="btn btn-primary">
    从角色移除用户
</a>

(4)AddUserToRole.cshtml

@model UserRoleViewModel

@{
    ViewBag.Title = "添加用户到角色";
}

<h2>@ViewBag.Title</h2>

<form asp-action="AddUserToRole" method="post">
    <input type="hidden" name="roleId" value="@Model.RoleId" />

    <select class="form-control" asp-for="UserId" asp-items="@(new SelectList(Model.Users, "Id", "UserName"))">
        <option> -- 请选择一个用户 -- </option>
    </select>

    <button class="btn btn-primary" type="submit">添加</button>
    <a class="btn btn-secondary" asp-action="EditRole" asp-route-id="@Model.RoleId">返回</a>
</form>

(5)DeleteUserFromRole.cshtml

@model UserRoleViewModel

@{
    ViewBag.Title = "从角色移除用户";
}

<h2>@ViewBag.Title</h2>

<form asp-action="DeleteUserFromRole" method="post">
    <input type="hidden" name="roleId" value="@Model.RoleId" />

    <select class="form-control" asp-for="UserId" asp-items="@(new SelectList(Model.Users, "Id", "UserName"))">
        <option> -- 请选择一个用户 -- </option>
    </select>

    <button class="btn btn-primary" type="submit">移除</button>
    <a class="btn btn-secondary" asp-action="EditRole" asp-route-id="@Model.RoleId">返回</a>
</form>

4.在Startup.cs中注册IdentityRole的服务

services.AddIdentity<Student, IdentityRole>(options =>
     {
         // Password settings.
         options.Password.RequireDigit = false;
         options.Password.RequireLowercase = false;
         options.Password.RequireNonAlphanumeric = false;
         options.Password.RequireUppercase = false;
         options.Password.RequiredLength = 1;
         options.Password.RequiredUniqueChars = 1;

         // Lockout settings.
         options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
         options.Lockout.MaxFailedAccessAttempts = 5;
         options.Lockout.AllowedForNewUsers = true;

         // User settings.
         options.User.AllowedUserNameCharacters =
                     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
         options.User.RequireUniqueEmail = false;
     }).AddEntityFrameworkStores<StudentIdentityDbContext>()
         .AddDefaultTokenProviders();

5.在_Layout.cshtml中添加角色管理按钮

<li class="nav-item dropdown">
   <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
       管理
   </a>
   <div class="dropdown-menu" aria-labelledby="navbarDropdown">
       <a class="nav-link text-dark" asp-area="" asp-controller="Student" asp-action="Index">学生管理</a>
       <a class="nav-link text-dark" asp-area="" asp-controller="Role" asp-action="Index">角色管理</a>
       <a class="nav-link text-dark" asp-area="" asp-controller="BookInfo" asp-action="BookDetails">管理图书信息</a>
   </div>
</li>

6.运行查看效果
Index
AddRole
EditRole
AddUserToRole
DeleteUserFromeRole

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我理解了你的问题。关于 Hangfire、MySQLASP.NET Core 3.1 的使用,我可以给出一些异常解决的建议。 首先,确保你已经按照官方文档正确地安装和配置了 Hangfire 和 MySQL。然后,根据你遇到的异常,尝试以下解决方法: 1. "Could not load file or assembly 'MySql.Data' or one of its dependencies" 异常 这个异常通常是由于缺少 MySQL 数据库驱动程序引起的。你需要在项目中添加对 MySQL 数据库驱动程序的引用。可以通过 NuGet 包管理器来安装 MySQL.Data。 2. "Specified key was too long; max key length is 767 bytes" 异常 这个异常是由于 MySQL 的索引长度限制引起的。解决方法是,在你的 DbContext 类中覆盖 OnModelCreating 方法,将所有字符串属性的最大长度设置为 255。 ``` protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var property in modelBuilder.Model.GetEntityTypes() .SelectMany(t => t.GetProperties()) .Where(p => p.ClrType == typeof(string))) { property.SetMaxLength(255); } } ``` 3. "MySqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding" 异常 这个异常通常是由于 MySQL 连接超时引起的。解决方法是,在连接字符串中添加 Connection Timeout 参数,例如: ``` "Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;Connection Timeout=60;" ``` 这将使连接超时时间为 60 秒。 希望这些解决方法能帮助你解决异常问题。如果你还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值