我们现在做了用户管理、角色管理、菜单管理。

但是大家有没有发现,我们的菜单要变化的话必须要刷新页面才行。这个体验感觉不太好。

今天我们就用全局通知组件来解决这个问题。

首先我们要改造以下我们的MainLayout,之前我们是在OnInitialized中直接获取的菜单,这样肯定没法刷新了,所以我们要先把获取菜单的内容单独拿出来

    private void RefreshMenu()
{
_user = UserEntity.Where(x => x.UserName == Furion.App.User.FindFirstValue(ClaimTypes.Name)).First();
if (_user == null)
{
return;
}
_menuItems = CreateMenuItems(MenuEntity.Where(x => x.Roles!.Any(y => y.Id == _user.RoleId)).ToList(), 0); }

这样我们就需要在OnInitialized调用以下我们的RefreshMenu

    protected override void OnInitialized()
{
base.OnInitialized();
RefreshMenu();
}

然后我们就可以注册全局的监听了。

MainLayout中添加

@inject IDispatchService<string> DispatchService

IDispatchService注入进来,这里我们只需要返回一个是什么就行了,所以泛型就只用了string,如果你需要接收更复杂的内容,可以修改这里的泛型类。

然后我们需要添加一个接收请求的方法

    private Task Notify(DispatchEntry<string> arg)
{
if (arg.Entry == "role")
{
RefreshMenu();
InvokeAsync(StateHasChanged);
}
return Task.CompletedTask;
}

这里我们只对角色页面进行处理。其他页面暂不处理,因为原理都是一样的,那些代码就不写了。所以我们只判断以下,如果发送的内容是role,那么我们就执行刷新菜单的操作。

然后我们需要注册这个Notify,还是在我们的OnInitialized中,终极版本如下

    protected override void OnInitialized()
{
base.OnInitialized();
RefreshMenu();
DispatchService.Subscribe(Notify);
}

我们使用DispatchService.SubscribeNotify注册到我们的消息系统中。

同时我们在页面销毁的时候需要注销我们的订阅,所以我们的MainLayout需要实现IDisposable接口。

@implements IDisposable

然后在Dispose方法中编写注销事件

    public void Dispose()
{
DispatchService.UnSubscribe(Notify);
}

然后我们来处理Role页面,这个页面里也是要先注入

@inject IDispatchService<string> DispatchService

然后我们在SavePermission方法最后,通知一下即可。

DispatchService.Dispatch(new DispatchEntry<string>(){Entry = "role"});

这里我们说一下自己是role,才可以和MainLayout判断对应。

整个SavePermission

    private void SavePermission()
{
if (RoleEntity == null)
{
return;
}
var menus = new List<MenuEntity>();
SaveRole(Menus!.Where(x => x.CheckedState != CheckboxState.UnChecked), menus);
RoleEntity.Permissions = menus;
RoleEntity.SaveMany(nameof(RoleEntity.Permissions));
RoleModal?.Toggle();
DispatchService.Dispatch(new DispatchEntry<string>(){Entry = "role"});
}

代码在代码在https://github.com/j4587698/BlazorLearn,分支lesson13

从零开始Blazor Server(13)--消息通知的更多相关文章

  1. 从零开始Blazor Server(1)--项目搭建

    项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...

  2. 从零开始Blazor Server(3)--添加cookie授权

    认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...

  3. 从零开始Blazor Server(15)--总结

    我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...

  4. 从零开始Blazor Server(4)--登录系统

    说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...

  5. 从零开始Blazor Server(6)--基于策略的权限验证

    写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...

  6. 从零开始Blazor Server(12)--编辑菜单

    上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...

  7. 从零开始Blazor Server(2)--整合数据库

    开篇 上一篇文章我们留了个尾巴,没有把freesql整合进去,这篇文章我们来整合. 目前的思路呢,是做一个简单的四不像的RABC,也有用户.角色. 权限三部分. 但是其中每个用户只有一个角色,即用户和 ...

  8. 从零开始Blazor Server(5)--权限验证

    序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...

  9. 从零开始Blazor Server(7)--使用Furion权限验证

    序 上面两篇我们讲了怎么用OnNavigateAsync来验证权限,又写了怎么用策略来验证权限. 其实我们既然集成了Fution,就可以用Furion带的方式来验证. 创建AdminHandler 我 ...

随机推荐

  1. CabloyJS - GitHub Readme

    简体中文 | English CabloyJS CabloyJS是一款顶级NodeJS全栈业务开发框架, 基于KoaJS + EggJS + VueJS + Framework7 文档 官网 & ...

  2. Java实现http大文件流读取并批量插入数据库

    1.概述 请求远程大文本,使用流的方式进行返回.需要设置http链接的超时时间 循环插入到List中,使用mybatis-plus批量插入到mysql中 2.需求 两台服务器 大文件放到其中一台服务器 ...

  3. 编程式导航路由跳转到当前路由(参数不变), 多次执行会抛出NavigationDuplicated的警告错误?

    注意:编程式导航(push|replace)才会有这种情况的异常,声明式导航是没有这种问题,因为声明式导航内部已经解决这种问题. 这种异常,对于程序没有任何影响的. 为什么会出现这种现象: 由于vue ...

  4. Linux文件拷贝脚本

    在工作中,我们经常遇到要从Linux服务器拷贝日志至本地或者定期清理日志的需求,在服务器上,大型系统的日志是按模块存储的,这就导致日志的文件目录较多且层级不统一.我们从众多的目录手工筛选要下载或者删除 ...

  5. while循环、do..while循环

    While循环 While循环呢它是更具条件来判断是否执行大括号里的内容 ,只要条件成立就会一值执行直到不满足条件它的语法格式: while(循环条件){ 执行语句 }那么我们来做一个小测试看看: p ...

  6. 聊聊C#中的composite模式

    写在前面 Composite组合模式属于设计模式中比较热门的一个,相信大家对它一定不像对访问者模式那么陌生,毕竟谁又没有遇到过树形结构呢.不过所谓温故而知新,我们还是从一个例子出发,起底一下这个模式吧 ...

  7. generatorConfig.xml自动生成实体类,dao和xml

    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration ...

  8. redis主从复制(九)

    先来简单了解下redis中提供的集群策略, 虽然redis有持久化功能能够保障redis服务器宕机也能恢复并且只有少量的数据损失,但是由于所有数据在一台服务器上,如果这台服务器出现硬盘故障,那就算是有 ...

  9. Visio Professional之活动图

    1 什么叫活动图? 活动图在本质上是一种流程图. 活动图(Activity diagram)是UML用于对系统的动态行为建模的一种常用工具,它描述活动的顺序,表示一个活动到另一个活动的控制流. 2.活 ...

  10. cookie、session、tooken

    一.cookie 的诞生 首先需要知道Http协议的无状态连接的,即这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的. 服务端,既不知道上一次请求和这一次请求的关联,也无法知道哪一个客户 ...