当前位置: 首页 > news >正文

asp.net Core 使用Layui 框架,用 PartialView作为左侧菜单项,进行动态加载

用 PartialView作为左侧菜单项,进行动态加载

1. 作品展示

2. 定义菜单数据模型

// Models/MenuItem.cspublicclassMenuItem{publicintId{get;set;}publicstringName{get;set;}// 菜单名称publicstringIcon{get;set;}// 图标(例如:layui-icon layui-icon-face)publicstringUrl{get;set;}// 点击后打开的页面地址publicintParentId{get;set;}// 父级ID,用于构建树形结构publicintSortOrder{get;set;}// 排序publicList<MenuItem>Children{get;set;}=newList<MenuItem>();}

3. 控制器实现

publicclassHomeController:Controller{privatereadonlyILogger<HomeController>_logger;publicHomeController(ILogger<HomeController>logger){_logger=logger;}publicIActionResultIndex(){returnView();}// 获取左侧菜单的 PartialViewpublicasyncTask<IActionResult>GetLeftMenu(){// 模拟从数据库获取菜单数据(实际开发中请从Service获取)varmenuList=awaitGetMenuDataAsync();// 构建树形结构varmenuTree=BuildTree(menuList,0);returnPartialView("_LeftMenu",menuTree);}// 模拟数据源privateTask<List<MenuItem>>GetMenuDataAsync(){varmenus=newList<MenuItem>{newMenuItem{Id=1,Name="仪表盘",Icon="layui-icon-home",Url="/Home/Dashboard",ParentId=0,SortOrder=1},newMenuItem{Id=2,Name="系统管理",Icon="layui-icon-set",Url="#",ParentId=0,SortOrder=2},newMenuItem{Id=3,Name="用户管理",Icon="layui-icon-user",Url="/User/Index",ParentId=2,SortOrder=1},newMenuItem{Id=4,Name="角色管理",Icon="layui-icon-group",Url="/Role/Index",ParentId=2,SortOrder=2},newMenuItem{Id=5,Name="日志管理",Icon="layui-icon-log",Url="/Log/Index",ParentId=2,SortOrder=3}};returnTask.FromResult(menus);}// 构建树形结构privateList<MenuItem>BuildTree(List<MenuItem>source,int?parentId){returnsource.Where(x=>x.ParentId==parentId).OrderBy(x=>x.SortOrder).Select(x=>newMenuItem{Id=x.Id,Name=x.Name,Icon=x.Icon,Url=x.Url,ParentId=x.ParentId,SortOrder=x.SortOrder,Children=BuildTree(source,x.Id)}).ToList();}}

4. 主视图 (Views/Home/Index.cshtml)

@{ Layout = null; }<!DOCTYPEhtml><html><head><metacharset="utf-8"><metaname="viewport"content="width=device-width, initial-scale=1"><title>ASP.NET Core + Layui 后台管理</title><linkrel="stylesheet"href="~/lib/layui/css/layui.css"/><style>/* 自定义样式 */.layui-layout-admin .layui-body{bottom:0;overflow:hidden;}.layui-tab-content{height:calc(100vh - 110px);padding:0;}.layui-tab-item{height:100%;}iframe{width:100%;height:100%;border:none;}</style></head><bodyclass="layui-layout-body"><divclass="layui-layout layui-layout-admin"><!-- 顶部导航栏 --><divclass="layui-header"><divclass="layui-logo">后台管理系统</div><ulclass="layui-nav layui-layout-right"><liclass="layui-nav-item"><ahref="javascript:;"><imgsrc="~/images/default-avatar.png"class="layui-nav-img">管理员</a><dlclass="layui-nav-child"><dd><ahref="">基本资料</a></dd><dd><ahref="">修改密码</a></dd><dd><aasp-action="Logout"asp-controller="Account">退出</a></dd></dl></li></ul></div><!-- 左侧菜单容器 --><divclass="layui-side layui-bg-black"id="leftMenuContainer"><divclass="layui-side-scroll"><!-- 这里将通过 Ajax 加载 PartialView --><divid="menuLoading"style="text-align:center;padding:20px;color:#ccc;"><iclass="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>加载菜单中...</div></div></div><!-- 右侧主体内容:Layui 选项卡容器 --><divclass="layui-body"><divclass="layui-tab"lay-filter="tab"lay-allowClose="true"><ulclass="layui-tab-title"><liclass="layui-this"lay-id="home">首页</li></ul><divclass="layui-tab-content"><divclass="layui-tab-item layui-show"><iframesrc="@Url.Action("Welcome","Home")"></iframe></div></div></div></div></div><scriptsrc="~/lib/jquery/dist/jquery.min.js"></script><scriptsrc="~/lib/layui/layui.js"></script><script>layui.use(['element','layer'],function(){varelement=layui.element;varlayer=layui.layer;var$=layui.$;// 加载左侧菜单loadLeftMenu();functionloadLeftMenu(){$.ajax({url:'@Url.Action("GetLeftMenu", "Home")',type:'GET',success:function(html){$('#leftMenuContainer .layui-side-scroll').html(html);// 重新渲染导航菜单element.render('nav');},error:function(){$('#menuLoading').html('<span style="color: #FF5722;">菜单加载失败</span>');}});}// 监听菜单点击事件(通过事件委托)$(document).on('click','.menu-item',function(e){e.preventDefault();varurl=$(this).data('url');varname=$(this).data('name');varid=$(this).data('id')||'tab_'+newDate().getTime();// 判断是否已存在选项卡if($('.layui-tab-title li[lay-id="'+id+'"]').length>0){element.tabChange('tab',id);}else{// 新增选项卡element.tabAdd('tab',{title:name,content:'<iframe src="'+url+'"></iframe>',id:id});element.tabChange('tab',id);}});// 选项卡切换时,可以触发 iframe 的刷新(可选)element.on('tab(tab)',function(data){console.log('切换到选项卡:'+data.index);});});</script></body></html>

5. 左侧菜单 PartialView (Views/Home/_LeftMenu.cshtml)

@model IEnumerable<MenuItem>@functions { // 递归渲染菜单的辅助方法 void RenderMenuItem(MenuItem item) { if (item.Children != null && item.Children.Any()) {<liclass="layui-nav-item"><ahref="javascript:;"><iclass="layui-icon @item.Icon"></i><span>@item.Name</span></a><dlclass="layui-nav-child">@foreach (var child in item.Children) {<dd><ahref="javascript:;"class="menu-item"data-url="@child.Url"data-id="@child.Id"data-name="@child.Name"><iclass="layui-icon @child.Icon"></i>@child.Name</a></dd>}</dl></li>} else {<liclass="layui-nav-item"><ahref="javascript:;"class="menu-item"data-url="@item.Url"data-id="@item.Id"data-name="@item.Name"><iclass="layui-icon @item.Icon"></i><span>@item.Name</span></a></li>} } }<ulclass="layui-nav layui-nav-tree"lay-filter="leftMenu">@foreach (var menu in Model) { @RenderMenuItem(menu) }</ul><style>/* 菜单图标样式 */.layui-nav-item .layui-icon{margin-right:8px;font-size:16px;}/* 子菜单缩进 */.layui-nav-child dd{padding-left:10px;}</style>
http://www.jsqmd.com/news/478771/

相关文章:

  • 重庆团建企业选哪家
  • CSDN一亿技术人员的福音:专知智库OPC研究院发布“技术人一人公司赋能计划”
  • C++ 模板进阶
  • 吃透 Java 泛型
  • OpenClaw vs Nanobot:2026 年你应该使用哪个 AI 代理框架?
  • 鸿蒙真机调试
  • MIT突破:多智能体系统破解PFAS替代材料发现难题
  • 中国人民大学等顶尖高校联手破解大模型“懒惰“难题
  • Ubuntu18.04 for Xilinx19.2 环境安装
  • 每日一题·栈在括号匹配中的应用
  • 小红书让搜索引擎“更懂“用户心思
  • 【多 Agent 协作系统】状态管理:共享记忆、分布式状态、一致性——构建可靠的多 Agent 状态系统!
  • 从零写栈:c语言版本
  • window环境安装openclaw
  • Failed to create the npcap service: 0x8007007e
  • 三大Java工具库:Hutool vs Guava vs Commons
  • ubuntu下 apt安装tomcat
  • 2026论文降重盘点:AIGC严查下谁能活?
  • 从「设计优先」到「实践优先」:构建自学习 AI Agent 的技能生态系统
  • 起诉状不用求人了!1个工具直接生成
  • 以初心守安全,以专业赋自由|VR精灵:解锁无束缚的创作底气
  • 【Java八股锁机制的认识】synchronized和reentrantlock区分,锁升级机制
  • 30.05亿元!衣橱应用程序市场规模披露,智能穿搭生态潜力加速释放
  • Linux文件类型
  • 什么是管理
  • SRA166防静电防护服安装保养指南:避免机器人静电损伤的实操详解
  • 99个大模型在各个行业的应用的案例【2026最新】
  • “养虾”狂飙背后的企业安全隐患:当AI接管企业内网,谁来为它戴上“紧箍咒”?
  • 基于SpringBoot+Vue的活动策划网站毕设项目(完整源码+论文+部署)
  • 救命神器! 降AI率平台 千笔 VS PaperRed,本科生专属利器!