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

NHibernate3.2+Asp.net MVC3+Extjs 4.0.2项目实践(五):Extjs树形导航菜单

  前一节中介绍了ViewPort,APPMenuTree定位在west region,继承自Ext.tree.Panel,需要实现的功能是从数据库System_Purview表中获取menu数据生成tree,并实现tree node的单击,在MainPanel中动态加载Tab。关键在于如何生成tree所需的Json数据,而tree的Json数据格式是这样的:

[
{id:'01',text:'01',children:[
{id:'01-01',text:'01-01',leaf:true},
{id:'01-02',text:'01-02',children:[
{id:'01-02-01',text:'01-02-01',leaf:true},
{id:'01-02-02',text:'01-02-02',leaf:true}
]},
{id:'01-03',text:'01-03',leaf:true}
]},
{id:'02',text:'02',leaf:true}
]

    首先tree我分为三级,root为静态构建,不用管它,第2级对应数据表的父级,第3级对应子级,这样我就定义了3个Model,System_Purview(Mindscape设计器自动生成),JSystem_Purview_Parent与JSystem_Purview_Child,来看一下代码。

o_u25434367_1340c315707g214_s.gif System.cs
隐藏行号 复制代码
  1. namespace TESZ.Data.Model
    
  2. {
    
  3.     public partial class JSystem_Purview_Child
    
  4.     {
    
  5.         public virtual string id { get; set; }
    
  6.         public virtual string text { get; set; }
    
  7.         public virtual bool expanded { get; set; }
    
  8.         public virtual bool leaf { get; set; }
    
  9.     }
    
  10.  
  11.     public partial class JSystem_Purview_Parent
    
  12.     {
    
  13.         public virtual string id { get; set; }
    
  14.         public virtual string text { get; set; }
    
  15.         public virtual bool expanded { get; set; }
    
  16.         public virtual bool leaf { get; set; }
    
  17.  
  18.         public IList<JSystem_Purview_Child> children { get; set; }
    
  19.     }
    
  20.  
  21.   [System.CodeDom.Compiler.GeneratedCode("NHibernateModelGenerator", "1.0.0.0")]
    
  22.   public partial class System_Purview
    
  23.   {
    
  24.     public virtual int PurviewId { get; set; }
    
  25.     public virtual int ParentPurviewId { get; set; }
    
  26.     public virtual string PurviewKey { get; set; }
    
  27.     public virtual string NavigationUrl { get; set; }
    
  28.     public virtual string ImageUrl { get; set; }
    
  29.     public virtual string PurviewName { get; set; }
    
  30.  
  31.     static partial void CustomizeMappingDocument(System.Xml.Linq.XDocument mappingDocument);
    
  32.  
  33.     public static System.Xml.Linq.XDocument MappingXml
    
  34.     {
    
  35.       get
    
  36.       {
    
  37.         var mappingDocument = System.Xml.Linq.XDocument.Parse(@"<?xml version='1.0' encoding='utf-8' ?>
    
  38. <hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'
    
  39.                    assembly='" + typeof(System_Purview).Assembly.GetName().Name + @"'
    
  40.                    namespace='TESZ.Data.Model'
    
  41.                    >
    
  42.   <class name='System_Purview'
    
  43.          table='`System_Purview`'
    
  44.          >
    
  45.     <id name='PurviewId'
    
  46.         column='`PurviewId`'
    
  47.         >
    
  48.       <generator class='identity'>
    
  49.       </generator>
    
  50.     </id>
    
  51.     <property name='ParentPurviewId'
    
  52.               column='`ParentPurviewId`'
    
  53.               />
    
  54.     <property name='PurviewKey'
    
  55.               column='`PurviewKey`'
    
  56.               />
    
  57.     <property name='NavigationUrl'
    
  58.               column='`NavigationUrl`'
    
  59.               />
    
  60.     <property name='ImageUrl'
    
  61.               column='`ImageUrl`'
    
  62.               />
    
  63.     <property name='PurviewName'
    
  64.               column='`PurviewName`'
    
  65.               />
    
  66.   </class>
    
  67. </hibernate-mapping>");
    
  68.         CustomizeMappingDocument(mappingDocument);
    
  69.         return mappingDocument;
    
  70.       }
    
  71.     }
    
  72.   }
    
  73. }
    

    数据访问层ISystem_PurviewRepository,System_PurviewRepository就不列出来了,和第二节中的Location_Country同理,接着是Service:

o_u25434367_1340c315707g214_s.gif ISystem_PurviewService.cs
隐藏行号 复制代码
  1. namespace TESZ.Services
    
  2. {
    
  3.     public interface ISystem_PurviewService
    
  4.     {
    
  5.         IList<System_Purview> GetSystem_Purviews();
    
  6.         bool CreateSystem_Purview(System_Purview system_Purview);
    
  7.  
  8.         IList<System_Purview> GetSystem_PurviewsParent();
    
  9.         IList<System_Purview> GetSystem_PurviewsChild(int parentPurviewId);
    
  10.     }
    
  11. }
    
o_u25434367_1340c315707g214_s.gif System_PurviewService.cs
隐藏行号 复制代码
  1. namespace TESZ.Services
    
  2. {
    
  3.     public class System_PurviewService : ISystem_PurviewService
    
  4.     {
    
  5.         private TESZ.Data.DataAccess.ISystem_PurviewRepository _iSystem_PurviewRepository;
    
  6.  
  7.         public System_PurviewService(TESZ.Data.DataAccess.ISystem_PurviewRepository iSystem_PurviewRepository)
    
  8.         {
    
  9.             _iSystem_PurviewRepository = iSystem_PurviewRepository;
    
  10.         }
    
  11.  
  12.         public IList<TESZ.Data.Model.System_Purview> GetSystem_Purviews()
    
  13.         {
    
  14.             return _iSystem_PurviewRepository.FindAll();
    
  15.         }
    
  16.  
  17.         public IList<TESZ.Data.Model.System_Purview> GetSystem_PurviewsParent()
    
  18.         {
    
  19.             return _iSystem_PurviewRepository.FindAll().Where(o => o.ParentPurviewId == 0).ToList();
    
  20.         }
    
  21.  
  22.         public IList<TESZ.Data.Model.System_Purview> GetSystem_PurviewsChild(int parentPurviewId)
    
  23.         {
    
  24.             return _iSystem_PurviewRepository.FindAll().Where(o => o.ParentPurviewId == parentPurviewId).ToList();
    
  25.         }        
    
  26.  
  27.         public bool CreateSystem_Purview(TESZ.Data.Model.System_Purview system_Purview)
    
  28.         {
    
  29.             return _iSystem_PurviewRepository.Create(system_Purview);
    
  30.         }
    
  31.     }
    
  32. }
    

    然后就是Controller控制器提供Json数据了。

o_u25434367_1340c315707g214_s.gif SystemPurviewController.cs
隐藏行号 复制代码
  1. public partial class AppCenterController : Controller
    
  2.     {
    
  3.         //
    
  4.         // GET: /SystemPurview/
    
  5. 
    
  6.         private IList<JSystem_Purview_Child> GetChildren(int parent)
    
  7.         {
    
  8.             var result = _iSystem_PurviewService.GetSystem_PurviewsChild(parent);
    
  9.             if (result != null && result.Count > 0)
    
  10.             {
    
  11.                 var ts = from t in result.AsQueryable()
    
  12.                          select new JSystem_Purview_Child()
    
  13.                          {
    
  14.                              id = t.PurviewKey.Trim(),
    
  15.                              text = t.PurviewName.Trim(),
    
  16.                              expanded = false,
    
  17.                              leaf = true
    
  18.                          };
    
  19.  
  20.                 return ts.ToList();
    
  21.             }
    
  22.  
  23.             return null;
    
  24.         }
    
  25.  
  26.         [AcceptVerbs(HttpVerbs.Get)]
    
  27.         public JsonResult JGetParentPurviews()
    
  28.         {
    
  29.             var result = _iSystem_PurviewService.GetSystem_PurviewsParent();
    
  30.             var data = from t in result.AsQueryable()
    
  31.                        select new JSystem_Purview_Parent()
    
  32.                        {
    
  33.                            id = t.PurviewKey.Trim(),
    
  34.                            text = t.PurviewName.Trim(),
    
  35.                            expanded = true,
    
  36.                            leaf = false,
    
  37.                            children = GetChildren(t.PurviewId)
    
  38.                        };
    
  39.  
  40.             return Json(data, JsonRequestBehavior.AllowGet);
    
  41.         }
    
  42.     }
    

    最后是定义TreeStore,Tree以及Tree的单击事件。

o_u25434367_1340c315707g214_s.gif ACMenuTreeStore.js
隐藏行号 复制代码
  1. Ext.define('Tesz.App.Stores.ACMenuTreeStore', {
    
  2.     extend: 'Ext.data.TreeStore',
    
  3.     alias: 'widget.acmenutreestore',
    
  4.     proxy: {
    
  5.         type: 'ajax',
    
  6.         url: 'JGetParentPurviews'
    
  7.     },
    
  8.     sorters: {
    
  9.             property: 'text',
    
  10.             direction: 'ASC'
    
  11.         }
    
  12. });
    

    ACMenuTreeStore继承自Ext.data.TreeStore,可以看出这里没有定义TreeStore的Model属性,因为只要获取符合TreeStore数据格式的Json字符串就可以了,而无需定义Fields。

o_u25434367_1340c315707g214_s.gif AppMenuTree.js
隐藏行号 复制代码
  1. Ext.require('Tesz.App.Stores.ACMenuTreeStore');
    
  2.  
  3. Ext.define('Tesz.App.AppMenuTree', {
    
  4.     extend: 'Ext.tree.Panel',
    
  5.     alias: 'widget.appmenutree',
    
  6.     id: 'MAINMENU',
    
  7.     region: 'west',
    
  8.     autoScroll: true,
    
  9.     useArrows: true,
    
  10.     width: 220,
    
  11.     border: 0,
    
  12.     store: Ext.create('Tesz.App.Stores.ACMenuTreeStore'),
    
  13.     rootVisible: false,
    
  14.     root: {
    
  15.         id: 'root_node',
    
  16.         nodeType: 'async',
    
  17.         text: 'All Menus'
    
  18.     },
    
  19.     listeners: {
    
  20.         'itemclick': function (view, record) {
    
  21.             var leaf = record.get('leaf');
    
  22.  
  23.             if (leaf) {
    
  24.                 var id = record.get('id');
    
  25.                 var text = record.get('text');
    
  26.                 var tabPanel = Ext.getCmp('MAINPANEL');
    
  27.                 var tab = tabPanel.getComponent(id);
    
  28.                 if (!tab) {
    
  29.                     tabPanel.add(Ext.create('Tesz.App.Panels.' + id)).show();
    
  30.                 }
    
  31.                 tabPanel.setActiveTab(tab);
    
  32.             }
    
  33.             else {
    
  34.                 var expand = record.get('expanded')
    
  35.                 if (expand) {
    
  36.                     view.collapse(record);
    
  37.                 }
    
  38.                 else {
    
  39.                     view.expand(record);
    
  40.                 }
    
  41.             }
    
  42.         }
    
  43.     },
    
  44.     dockedItems: [{
    
  45.         xtype: 'toolbar',
    
  46.         items: [{
    
  47.             iconCls: 'x-expand-all',
    
  48.             tooltip: 'expand all nodes',
    
  49.             handler: function () {
    
  50.                 Ext.getCmp('MAINMENU').expandAll();
    
  51.             }
    
  52.         }, {
    
  53.             iconCls: 'x-collapse-all',
    
  54.             tooltip: 'collapse all nodes',
    
  55.             handler: function () {
    
  56.                 Ext.getCmp('MAINMENU').collapseAll();
    
  57.             }
    
  58.         }]
    
  59.     }]
    
  60. });
    

    AppMenuTree继承自Ext.tree.Panel,第1级node默认属性rootVisible: false设置为隐藏;通过Tree的"itemclick”事件来动态加载ACMainPanel的Tab,先判断node的"leaf”属性,如果为true则执行加载,如果为false则执行expand或collapse;所有的Tab的自定义组件都在Components/Panels文件夹,加载实现方法为tabPanel.add(Ext.create('Tesz.App.Panels.' + id)).show();如何来做到正确对应呢,可以参考事先定义的3个Model类,JSystem_Purview_Parent与JSystem_Purview_Child的"id”,也就是tree的nodeId,对应System_Purview表的PurviewKey字段,而所需加载的Tab,js组件文件名称与id都都定义为PurviewKey,这样就做到了一一对应;

o_u25434367_1340c315707g214_s.gif CTRY.js
隐藏行号 复制代码
  1. Ext.define('Tesz.App.Panels.CTRY', {
    
  2.     alias: 'widget.ctry',
    
  3.     extend: 'Ext.Panel',
    
  4.     id: 'CTRY',
    
  5.     title: 'Country',
    
  6.     closable: true,
    
  7.     autoLoad: {
    
  8.         url: 'CountryPage',
    
  9.         scripts: true
    
  10.     },
    
  11.     listeners: {
    
  12.         resize: function () {
    
  13.             var main = Ext.getCmp('MAINPANEL');
    
  14.             var grid = Ext.getCmp('COUNTRYGRID');
    
  15.             if (grid)
    
  16.                 grid.setWidth(main.getWidth()-5);
    
  17.         }
    
  18.     }
    
  19. });
    

    至此,主界面部分就基本完成了。费了好大的劲,研究调试好久才取得这样的结果,希望能和同僚们分享一下经验。

转载于:https://www.cnblogs.com/leowuang/archive/2011/11/01/2231485.html

相关文章:

  • 利用指针间隔的输出字符串中的字符
  • Java中Httpsession是如何实现的?
  • 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器
  • 洛谷 P1616 疯狂的采药
  • 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别
  • Shell的一些基本概念
  • 剑指Offer——二叉搜索树的第K个节点
  • python 排序 桶排序
  • ubuntu之路——day7.2 regularization
  • 查看mysql数据库大小
  • Java程序员编程性能优化必备的34个小技巧
  • HTTP/1.1-HTTP/2.0-HTTP/3.0-HTTPS
  • DP总结
  • 全网最详细python3包管理工具教程-pip
  • nginx 配置简单的静态页面
  • [笔记] php常见简单功能及函数
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • flutter的key在widget list的作用以及必要性
  • Golang-长连接-状态推送
  • go语言学习初探(一)
  • HTTP那些事
  • HTTP--网络协议分层,http历史(二)
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Protobuf3语言指南
  • Solarized Scheme
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于游标的分页接口实现
  • 浅谈web中前端模板引擎的使用
  • 通过npm或yarn自动生成vue组件
  • 通信类
  • 说说我为什么看好Spring Cloud Alibaba
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2022 CVPR) Unbiased Teacher v2
  • (5)STL算法之复制
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net core 6 redis操作类
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • :如何用SQL脚本保存存储过程返回的结果集
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [IE技巧] IE8中HTTP连接数目的变化
  • [LeetBook]【学习日记】数组内乘积
  • [leetcode]_Symmetric Tree
  • [NOIP2014] 提高组 洛谷P1941 飞扬的小鸟
  • [Python] 输入与输出
  • [Python进阶] 获取计算机相关信息:Psutil