James: 本系列为大家介绍如何使用 Blazor 来开发管理后台,有兴趣的朋友欢迎跟着实验,体验 Blazor 开发的高效与乐趣。

本系列目录:

  1. 使用 Blazor 开发内部后台(一):认识Blazor

  2. 使用 Blazor 开发内部后台(二):了解 Blazor 组件

  3. 使用 Blazor 开发内部后台(三):登录

前言

很多后台管理系统会采用侧边栏或上方导航组件来实现导航功能,其实也不复杂,但本文介绍另一种简单直接的选择:仍使用上中下三层布局,单独写一个Home页面用于导航。这样的好处在于Home首页或Layout组件里,不用写嵌套的结构和处理导航组件的点击事件。

Card组件

请读者先自行参考Antd Blazor文档:网格型内嵌卡片。Card本身是非常简单的展示组件,而网格型内嵌卡片,可以方便我们快速搭建一个布局整齐的导航栏。先展示一下页面:

卡片导航

Card的Title用来作为类别的主题,下方的子卡片则展示具体的页面链接。这样每个页面的基础代码如下:

<Card Title="分类主题名称" Bordered="true"><CardGrid Style="width: 25%; text-align: center; padding: 0 5px; background-color: whitesmoke;" Hoverable="true"><a href="/MyUrl1" style="font-size:20px">要导航的页面名1</a></CardGrid><CardGrid Style="width: 25%; text-align: center; padding: 0 5px; background-color: whitesmoke;" Hoverable="true"><a href="/MyUrl2" style="font-size:20px">要导航的页面名2</a></CardGrid>
</Card>

配置和动态化

随着时间的推进,后台管理系统通常会加入越来越多的功能,因此也要求导航栏的内容可以根据配置动态展示。

如果使用上述Card组件,则可以很直观地定义一个Json数据结构:

[{"Title": "用户管理","Items": [{"Name": "列表查询","Route": "/user/list","Disabled": true}]},{"Title": "图书管理","Items": [{"Name": "列表查询","Route": "/book/list"}]},{"Title": "音频管理","Items": [{"Name": "列表查询","Route": "/video/list","Disabled": true}]},{"Title": "新闻管理","Items": [{"Name": "列表查询","Route": "/news/list"}],"Hide": true},{"Title": "统计分析","Items": [{"Name": "登录相关","Route": "/analysis/login","Disabled": false},{"Name": "图书相关","Route": "/analysis/book","Disabled": true},{"Name": "音频相关","Route": "/analysis/video","Disabled": true},{"Name": "新闻相关","Route": "/analysis/news","Disabled": true}]}
]

这里我增加了额外的Hide和Disabled字段,Hide字段决定是否显示某个主题,而Disabled字段决定是否启用某个页面的导航链接(但不隐藏)。对应的Model类如下:

    public class HomePageContent{public string Title { get; set; }public HomePageContentItem[] Items { get; set; }public bool Hide { get; set; }}public sealed class HomePageContentItem{public string Name { get; set; }public string Route { get; set; }public bool Disabled { get; set; }}

接着我们要设计如何让Blazor收到这样的配置内容,我们可以让后端以Http接口的方式提供,但我这里介绍一种更直接的办法,供读者参考:

在Blazor项目wwwroot文件夹下创建一个uidata文件夹,在里面再创建一个home文件夹,然后创建一个叫navLinks.json的静态文件用于存储上述的Json数据。

在Blazor项目Services文件夹(没有的话自己创建一个),定义一个接口:

    public interface IUserInterfaceDataService{Task<HomePageContent[]> LoadHomePageContentsAsync();}

该接口封装所有类似静态文件的访问请求,符合高内聚低耦合的设计。现在添加一个具体类:

    internal class UserInterfaceDataService : IUserInterfaceDataService{private const string Root = "/uidata/";private readonly HttpClient _client;public UserInterfaceDataService(HttpClient client){_client = client;}public Task<HomePageContent[]> LoadHomePageContentsAsync() => GetAsync<HomePageContent>("home/naviLinks.json");private async Task<T[]> GetAsync<T>(string path){var data = await _client.GetFromJsonAsync<T[]>(Root + path);return data;}}

再次提醒:别忘了依赖注入!

之后,我们让home.razor页面在初始化时,先访问静态文件naviLinks.json,然后再根据该文件里的Json数据展示首页内容。在home.razor.cs里,加入代码:

    public partial class Home{private HomePageContent[] _contentList = Array.Empty<HomePageContent>();protected async override Task OnInitializedAsync(){_contentList = await UIDataService.LoadHomePageContentsAsync();}}

数据可以获取了,那么如何依赖这样的结构动态生成页面呢?Razor语法的易用性就体现出来了:

@page "/home"
@inject HttpClient Http
@inject IUserInterfaceDataService UIDataService<div style="margin:40px">@foreach (var content in _contentList){@if (!content.Hide){<div style="margin:20px 0"><Card Title=@content.Title Bordered="true">@foreach (var item in content.Items){<CardGrid Style="width: 25%; text-align: center; padding: 0 5px; background-color: whitesmoke;" Hoverable="@(!item.Disabled)">@if (item.Disabled){<span style="font-size:20px;color:dimgray">@item.Name</span>}else{<a href=@item.Route style="font-size:20px">@item.Name</a>}</CardGrid>}</Card></div>}}
</div>

基于@if和@for关键词,可以非常简单地实现HTML代码的动态生成。

现在我们访问首页,Blazor就可以根据静态文件的配置内容动态生成页面了。静态文件的更新不需要重启后端程序,因此首页导航栏的更新对用户和后端来说,都是无感的。有的读者担心浏览器可能会缓存静态文件,导致配置更新不及时——解决办法有很多,例如可以将每次静态文件的请求链接加入一个时间戳的请求参数(.../navLinks.json?t=xxx),或者干脆让用户清除浏览器页面缓存(毕竟只是内部用的后台)。

结束语

下一篇文章准备介绍一下如何使用Antd Blazor组件搭建后台系统中常见的“条件搜索+列表展示”页。不过本月杂事很多,应该要过些日子再更了。

今天是八一建军节,“聚是一团火,散是满天星”,祝现役、退役的所有军人朋友们节日快乐!祝伟大的祖国繁荣昌盛!


欢迎加入 Blazor 中文社区,共同建设热爱的技术社区!

QQ群:1012762441

微信群:JamesYengMVP(加我邀请)

使用 Blazor 开发内部后台(四):基于Card组件快速搭建导航首页相关推荐

  1. 使用 Blazor 开发内部后台(三):登录

    James: <使用Blazor开发内部后台>系列是技术社区中一位朋友投稿的系列文章,介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历. 本文为第三篇, ...

  2. 使用 Blazor 开发内部后台(二):了解 Blazor 组件

    James:  转载技术社区中一位朋友最新的文章,介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历. 什么是Blazor组件 Blazor 应用是使用 Razor ...

  3. 使用Blazor开发内部后台(一):认识Blazor

    转载技术社区中一位朋友最新的文章,介绍自己为公司的 WebForm 遗留系统使用 Blazor 重写前端 UI 的经历. 前言 啊,又好久没写文章了,这一年一直在接触新的领域,扩展了一下技术面,学了很 ...

  4. 基于Hexo框架快速搭建个人博客--文章一键发布(五)

    基于Hexo框架快速搭建个人博客--文章一键发布 一.文章对比 二.发布到Github 三.一键发布 四.总结 博客链接: 会思想的苇草i 文章链接: 基于Hexo框架快速搭建个人博客–搭建(一) 基 ...

  5. test.php创建,基于phpstudy简单快速搭建一个php程序

    原标题:基于phpstudy简单快速搭建一个php程序 人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升. 1 安装phpstudy 通过以下链接download.csdn.net/downl ...

  6. 开发指南专题四 JEECG微云快速开发平台--JEECG开发环境搭建

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 开发指南 ...

  7. php开发架构设计,基于php的快速搭建SPA开发架构的框架设计与开发

    程序 员之 家 基于 P h p 的快速搭建 S PA 开发架构的框架设计与 开发 ?叶松鑫 马 灏辉 何子 安 彭吉琪 黄钰冰 (佛 山科学技 术学 院 电子 信息工程 学 院 广东 佛 山 528 ...

  8. Android开发笔记(四十)组件通讯工具Intent

    Intent的用途与组成 Intent用于处理Android各组件之间的通讯.Intent完成的工作主要有三部分: 1.Intent需标明本次通讯请求是从哪里来,到哪里去,要怎么走: 2.发起方携带上 ...

  9. 基于RuoYi框架快速搭建自己的后台管理系统

    RuoYi的介绍 RuoYi是一个后台管理系统,基于经典技术组合(Spring Boot.Apache Shiro.MyBatis.Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而 ...

最新文章

  1. windows主机资源Snmp OIDs CPU, Memory, Disk等
  2. 武汉锅检所检测机器人_管道检测机器人---此CCTV非彼CCTV
  3. 2021年阳光高考成绩查询,高考攻略 | 2021年阳光高考月历来了!
  4. 计算机考研:计算机操作系统知识点复习
  5. GitHub 建立远程仓库
  6. 论文浅尝 | AMUSE: 基于 RDF 数据的多语言问答语义解析方法
  7. MIUI10迎来最后一波开发版推送 用户体验再升级
  8. SpringBoot教程
  9. 日志分析(shell脚本)
  10. 电动自动吞吐式IC卡RFID读写器EMV模块HX150进卡命令
  11. matlab信号如何加白噪声,matlab给信号加白噪声
  12. 微信小程序input只允许输入数字
  13. lisp横断面数据文件_【干货】横断面测量数据批量转换成断面图,CASS应该如何做?...
  14. 阿里字体图标库的使用
  15. 二元关系:(自反,对称,传递)关系的求逆与闭包
  16. hrbust 1699 矩阵游戏【枚举找规律】
  17. 序列标注 | (4) Hierarchically-Refined Label Attention Network for Sequence Labeling
  18. [洛谷1849] 拖拉机
  19. 3D游戏引擎入门课程——场景管理
  20. 《汇编语言》第十章 call 和 ret 指令

热门文章

  1. JavaScript数组sort方法(数组排序)
  2. 用了30天整理的一些GO语言学习资料,2019请你加油
  3. 在ubuntu 16.04里使用python—scrapy将爬取到的数据存到mysql数据库中的一些随笔
  4. BZOJ 4516: [Sdoi2016]生成魔咒 [后缀自动机]
  5. 转帖不会乱码的,powershell网络蜘蛛
  6. 解题报告 树形图计数
  7. 男人别让爱你的女孩流泪
  8. 参数化的RBAC模型
  9. canvas 平滑运动_什么是电视上的运动平滑?人们为什么讨厌它?
  10. IT:如何在Windows Server 2008 R2上安装Hyper-V虚拟化