从零开始Blazor Server(13)--消息通知
我们现在做了用户管理、角色管理、菜单管理。
但是大家有没有发现,我们的菜单要变化的话必须要刷新页面才行。这个体验感觉不太好。
今天我们就用全局通知组件来解决这个问题。
首先我们要改造以下我们的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.Subscribe把Notify注册到我们的消息系统中。
同时我们在页面销毁的时候需要注销我们的订阅,所以我们的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)--消息通知的更多相关文章
- 从零开始Blazor Server(1)--项目搭建
项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...
- 从零开始Blazor Server(3)--添加cookie授权
认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...
- 从零开始Blazor Server(15)--总结
我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...
- 从零开始Blazor Server(4)--登录系统
说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...
- 从零开始Blazor Server(6)--基于策略的权限验证
写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...
- 从零开始Blazor Server(12)--编辑菜单
上个星期有点事,导致没法及时更新.现在我们继续更我们的从零开始系列. 这个系列也快要结束了,目前规划再有2-3篇,就结束了. 今天我们来说编辑菜单的问题,说实话菜单这种东西,你不更新代码加个页面,单独 ...
- 从零开始Blazor Server(2)--整合数据库
开篇 上一篇文章我们留了个尾巴,没有把freesql整合进去,这篇文章我们来整合. 目前的思路呢,是做一个简单的四不像的RABC,也有用户.角色. 权限三部分. 但是其中每个用户只有一个角色,即用户和 ...
- 从零开始Blazor Server(5)--权限验证
序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...
- 从零开始Blazor Server(7)--使用Furion权限验证
序 上面两篇我们讲了怎么用OnNavigateAsync来验证权限,又写了怎么用策略来验证权限. 其实我们既然集成了Fution,就可以用Furion带的方式来验证. 创建AdminHandler 我 ...
随机推荐
- 题解0014:信奥一本通1472——The XOR Largest Pair(字典树)
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1472 题目描述:在给定的 N 个整数中选出两个进行异或运算,求得到的结果最大是多少. 看到这 ...
- c++ FHQ Treap
前面我们对平衡树有了个大概的了解 关于 Treap Treap=Binary Search Tree + Heap 二叉搜索树 + 二叉堆(一般是小根堆) Treap 每一个节点有两个值 一个值是平衡 ...
- 技术分享 | App常见bug解析
原文链接 功能Bug 内容显示错误 前端页面展示的内容有误. 这种错误的产生有两种可能 1.前端代码写的文案错误 2.接口返回值错误 功能错误 功能错误是在测试过程中最常见的类型之一,也就是产品的功能 ...
- 文件上传漏洞靶场分析 UPLOAD_LABS
文件上传漏洞靶场(作者前言) 文件上传漏洞 产生原理 PASS 1) function checkFile() { var file = document.getElementsByName('upl ...
- BUUCTF-小明的保险箱
小明的保险箱 16进制打开可以发现存在一个RAR压缩包,压缩包里面应该就是flag文本 使用ARCHPR破解即可
- canvas简易画布
今天学习了canvas,利用它做了一个简易版的画板,校验自己所学的知识,分享出来以供大家学习指教.先上效果图. 主要是使用了canvas的stroke和clearReact来实现画板的绘画和橡皮擦功能 ...
- MYSQL中IF IN语句
以下代码摘自后台管理系统中的一部分SQL语句: 当取数状态为1或2时,才展示取数时间,否则,取数时间展示为空 当申报状态为2.3.4或5时,才展示申报时间,否则,申报时间展示为空 select A.Q ...
- HTML入门,基础知识
初识HTML HTML: 超文本标记语言 一.HTML的基本结构 根控制标记(头) 头控制标记(头) 标题 标题标记 头控制标记(尾) 网页显示区域(一般要实现的代码都在这里写) &l ...
- Linux操作系统(6):进程管理和服务管理
进程的基本介绍 1)在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号. 2)每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程.例如 www 服务器 ...
- Git的历史和安装Git及环境配置
Git历史同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代. Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务 ...