利用ASP.Net|利用ASP.Net Core中的Razor实现动态菜单
目录
- 准备
- 1.实现思路
- 2.编码
- 2.1建立渲染内容填充方法
- 2.2建立分部视图
- 2.3 调用分布视图
准备 1.框架
.netcore版本 yishaadmin开源框架
2.模板
本文模板使用adminlte3.0,文档地址
3.菜单表关键字段
id 表主键(当前菜单)
ParentId 父级ID(父级菜单 为0时为顶级菜单,也可能为内容)
MenuUrl 菜单地址(只有页面有地址,本身菜单是空)
MenuType 菜单类型(1是菜单 2是页面 3是按钮)
MenuIcon 图标样式
4.菜单表实体
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; using YiSha.Util; namespace YiSha.Entity.SystemManage{[Table("SysMenu")]public class MenuEntity : BaseExtensionEntity{[JsonConverter(typeof(StringJsonConverter))]public long? ParentId { get; set; }public string MenuName { get; set; }public string MenuIcon { get; set; }public string MenuUrl { get; set; }public string MenuTarget { get; set; }public int? MenuSort { get; set; }public int? MenuType { get; set; }public int? MenuStatus { get; set; }public string Authorize { get; set; }public string Remark { get; set; }[NotMapped]public string ParentName { get; set; }}}
本文是由于框架内置菜单不支持顶级菜单显示为内容,以及菜单最多只支持三级菜单的问题,故进行了调整。
1.实现思路 下图1区域渲染为菜单,菜单通过点击URL将内容填充到2区域。
文章图片
2.编码
2.1建立渲染内容填充方法
将传进来的url通过ajax调用最终渲染到内容区域(id为#Content的Div中),其中beforeSend方法显示Loadding 可根据需要自行调整。url为{area:exists}/{controller=Home}/{action=Index}以及{controller=Home}/{action=Index}根据框架配置填写至菜单
function LoadContent(url) {if (url == null || url == "")return; $.ajax({url: url,beforeSend: function (XHR) {$.blockUI({ message: ' ' + "加载中..." + '', css: { border: "none", backgroundColor: 'transparent' } }); },success: function (data) {$("#Content").html(data); setTimeout(function () { $.unblockUI(); }, 100); },error: function (data, status, e) {$("#Content").html("页面加载失败," + data.status + "," + url + "
" + data.responseText); setTimeout(function () { $.unblockUI(); }, 100); }}); }
2.2建立分部视图
通过建立分部视图MenuTree,循环传入的菜单,初始化时先获取父级ID(ParentId)为0并且类别(MenuType)不为按钮的菜单集合进行循环,根据menuEntity.MenuUrl判断是否为页面,如果依然为菜单则使用Html.PartialAsync("MenuTree")调用自身来实现递归,第二次则根据ViewData["Menu"]传入的当前id作为父级id来寻找子集,直到寻找到最后的层级。
@using System.Collections.Generic@using YiSha.Entity.SystemManage; @model List@{if (Model.Any()){long id = 0L; var menu = ViewData["Menu"] as MenuEntity; if (menu != null)id = menu.Id.Value; @foreach (var menuEntity in Model.Where(o => o.ParentId == id && o.MenuType != (int)MenuTypeEnum.Button)){var icno = string.IsNullOrEmpty(menuEntity.MenuIcon) ? "fa fa-comment" : menuEntity.MenuIcon; @if (!string.IsNullOrEmpty(menuEntity.MenuUrl)){ @menuEntity.MenuName }else{ViewData["Menu"] = menuEntity;
@menuEntity.MenuName }}}}
2.3 调用分布视图
【利用ASP.Net|利用ASP.Net Core中的Razor实现动态菜单】到此这篇关于利用ASP.Net Core中的Razor实现动态菜单的文章就介绍到这了,更多相关ASP.Net Core Razor动态菜单内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- asp.net中Server.MapPath的使用
- Asp.net core MVC paypal支付回调——app支付
- .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控
- 如何利用virtualbox虚拟机运行智汀家庭云
- Android视频编辑SDK--RDVECore来自锐动的无UI,高度抽象化API
- 全场景AI推理引擎MindSpore|全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验
- 利用create-react-app结合react-reduxreact-router4构建单页应用
- 基于SqlSugar的数据库访问处理的封装,支持.net|基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
- 安卓build/core/Makefile 以及main.mk
- Running ASP.NET Core applications on Windows Subsystem for Linux