1.新建访问的控制器动作返回视图,在视图中使用easyui的treegrid插件来得到后台得到的json数据显示多级菜单

 public ActionResult Menu()
{
return View();
}

视图:

@{
ViewBag.Title = "Menu";
Layout = "~/Views/Shared/_GridView.cshtml";
} @section header{}
@section body{
<div id="dataGrid" class="easyui-layout" data-options="fit:true">
<table id="gridView"></table>
</div>
}
@section scripts{ <script src="~/Content/oa/scripts/xlayout.js"></script>
<script type="text/javascript">
$(function () {
alert()
load();
});
function load() {
$('#gridView').treegrid({
url: '/WxMenu/MenuGridView',
title: '微信菜单配置',
treeField: 'Text',
fit: true,
fitColumns: true,
idField: 'Id',
loadMsg: '数据正在加载中......',
sortName: 'Orderby',
sortOrder: 'asc',
pagination: true,
singleSelect: true,
pageSize: ,
pageNumber: ,
pageList: [, , , ],
queryParams: {},
rownumbers: true,
checkOnSelect: true,
selectOnCheck: true,
lines: true,
columns: [[
{ field: 'ck', checkbox: true, width: },
{ field: 'Text', title: '菜单名字', width: , align: 'left' },
{
field: 'MenuId', title: '菜单编码', width: , align: 'left',
formatter: function (value, row, index) {
return value == "-1" ? "" : value;
}
},
{
field: 'IsEnable', title: '有效', width: , align: 'center',
formatter: function (value, row, index) {
return "<span style=\"color:{1};\">{0}</span>".format(
value == "" ? "已启用" : "已禁用",
value == "" ? "green" : "red");
}
},
{ field: 'OrderBy', title: '排序号', width: , align: 'left' },
{
field: 'Target', title: '动作类型', width: , align: 'center',
formatter: function (value, row, index) {
switch (value) {
case 'view':
return "跳转URL";
case 'click':
return "点击推事件";
case 'scancode_push':
return "扫码推事件";
case 'scancode_waitmsg':
return "扫码推事件且弹出(消息接收中)提示框";
case 'pic_sysphoto':
return "弹出系统拍照发图";
case 'pic_photo_or_album':
return "弹出拍照或者相册发图";
case 'pic_weixin':
return "弹出微信相册发图器";
case 'location_select':
return "弹出地理位置选择器";
case 'media_id':
return "下发消息(除文本消息)";
case 'view_limited':
return "跳转图文消息URL";
}
}
},
{ field: 'Ico', title: 'MenuKey', width: , align: 'left' },
{ field: 'Url', title: '菜单URL', width: , align: 'left' }
]],
toolbar: [{
id: 'btnAdd',
text: '添加',
iconCls: 'icon-add',
handler: function () {
showWindow("添加菜单", "/OA/WeiXin/MenuEdit/0", , );
}
}, {
id: 'btnAdd',
text: '编辑',
iconCls: 'icon-edit',
handler: function () {
var row = $('#gridView').datagrid('getSelected');
if (!row) {
showMsg("系统提示", "请选择要编辑的行", true);
return;
}
if (row.Id == "") {
showMsg("系统提示", "此数据不能修改", true);
return;
} showWindow("添加菜单", "/OA/WeiXin/MenuEdit/" + row.Id, , );
}
},
{
id: 'btnDelete',
text: '删除',
iconCls: 'icon-remove',
handler: function () {
var rows = $('#gridView').datagrid('getChecked');
if (!rows || rows.length == ) {
showMsg("系统提示", "请选择要删除的行", true);
return;
} showConfirm('系统提示', '删除数据后将无法恢复,还确认删除吗?', function () {
var ids = new Array();
var isRoot = false;
$.each(rows, function (i, n) {
ids.push("'" + n.Id + "'");
isRoot = n.MenuId == "";
if (isRoot) return false;
});
if (isRoot) {
showMsg("系统提示", "菜单(微信公众平台菜单)不能删除!", true);
return;
} showProcess(true, "系统提示", "正在删除中......");
setTimeout(function () {
$.ajax({
url: "/OA/WeiXin/MenuDelete",
data: { ids: ids.toString(",") },
dataType: "json",
type: "POST",
traditional: true,
success: function (result) {
showProcess(false);
if (result.Success) {
showMsg("系统提示", result.Message, false);
$('#gridView').datagrid('reload');
} else {
showMsg("系统提示", result.Message, true);
}
}
});
}, );
});
}
}, {
id: 'btnRefresh',
text: '更新',
iconCls: 'icon-reload',
handler: function () {
$('#gridView').treegrid('reload');
}
}, {
id: 'btnRefresh',
text: '发布到微信公众平台',
iconCls: 'icon-redo',
handler: function () {
$.ajax({
url: "/WxMenu/MenuToWeiXin",
data: {},
dataType: "json",
type: "POST",
traditional: true,
beforeSend: function () {
showProcess(true, "系统提示", "正发布到微信公众平台......");
},
error: function () {
},
success: function (result) {
showMsg("系统提示", result.Message, false);
},
complete: function () {
showProcess(false);
}
});
}
}],
onLoadSuccess: function () {
var pager = $('#gridView').treegrid('getPager');
pager.pagination({
beforePageText: '第',
afterPageText: '页 共 {pages} 页',
displayMsg: '当前显示 {from} - {to} 条记录 共 {total} 条记录',
buttons: []
});
} });
} function radWindowCallBackFn() {
showMsg("系统提示", "存盘成功!", false);
$('#gridView').treegrid('reload');
}
</script>}

2. 后台动作返回一个content()。

  public ActionResult MenuGridView(int? page, int? rows, string sort = "", string order = "asc")
{
return Content(GetMenuGridTree());
}

3.通过GetMenuGridTree()函数来返回一个json对象:

public string GetMenuGridTree()
{
NHibernateHelper nhlper = new NHibernateHelper();
ISession session = nhlper.GetSession();
List<TreeModel> result = new List<TreeModel>();
List<TreeModel> children = new List<TreeModel>();
IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>();
WeiXinMenu root = kinds.FirstOrDefault(c => c.ParentId == "-1");
GetMenuGridTree(kinds, children, "");
result.Add(new TreeModel
{
Id = root.Id.ToString(),
MenuId = root.MenuId,
Text = root.MenuName,
Url = root.MenuUrl,
ParentMenuId = root.ParentId.ToString(),
IsEnable = root.IsEnable,
OrderBy = root.OrderBy.ToString(),
Target = root.MenuType,
Ico = root.MenuKey,
children = children
});
return JsonConvert.SerializeObject(result);
}

其中NHibernateHelper是申明了一个Nhibernate的辅助类,用来建立一个isessionfactory(会话工厂),然后打开一个isession,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Cfg; namespace Data
{
public class NHibernateHelper
{
private ISessionFactory _sessionFactory;
public NHibernateHelper()
{
//创建ISessionFactory
_sessionFactory = GetSessionFactory();
}
public ISessionFactory GetSessionFactory()
{
//配置ISessionFactory
return (new Configuration()).Configure().BuildSessionFactory();
}
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
}
}

其中TreeModel类,是创建一个有递归子类的数据库存的菜单表的类。跟我们在Nhibernate中持久化实体的菜单类似,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Domain.OrmLib.Model
{
public class TreeModel
{
public string Id { get; set; }
public string MenuId { get; set; }
public string Text { get; set; }
public string Url { get; set; }
public string Ico { get; set; }
public string ParentMenuId { get; set; }
public string IsEnable { get; set; }
public string OrderBy { get; set; }
public string Target { get; set; }
public string IsStretch { get; set; }
public string IsEdit { get; set; }
public string IsDelete { get; set; }
public string Remark { get; set; }
public string state { get; set; }
public string iconCls { get; set; }
public List<TreeModel> children { get; set; }
} }

其中IEnumerable<WeiXinMenu> kinds = session.Query<WeiXinMenu>();这句就是通过Nhibernate的会话isession查询到并枚举我们的实体WeiXinMenu。先把root根部的实体查询出来。

GetMenuGridTree()方法就是递归的调用得到剩下的chilren.

 private void GetMenuGridTree(IEnumerable<WeiXinMenu> kinds, List<TreeModel> children, string pId)
{
foreach (WeiXinMenu p in kinds.Where(c => c.ParentId == pId).OrderBy(c => c.OrderBy))
{
TreeModel gt = new TreeModel();
gt.Id = p.Id.ToString();
gt.MenuId = p.MenuId;
gt.Text = p.MenuName;
gt.Url = p.MenuUrl;
gt.ParentMenuId = p.ParentId;
gt.IsEnable = p.IsEnable;
gt.OrderBy = p.OrderBy.ToString();
gt.Target = p.MenuType;
gt.Ico = p.MenuKey; List<TreeModel> childrenTmp = new List<TreeModel>(); GetMenuGridTree(kinds, childrenTmp, p.MenuId); /*
if (childrenTmp.Count > 0)
{
gt.state = "closed";
}
*/ gt.children = childrenTmp; children.Add(gt);
}
}

MVC+Nhibernate+jquery+easyui递归实现多级菜单的更多相关文章

  1. 年底小回顾(MVC+NHibernate+Jquery+JqueryUI——网站)

    1.附:利用MVC+NHibernate+Jquery+JqueryUI这些技术可以做出一个比较好的前台+后台网站.下面是本人对这些技术的笔记,作为私人年底小结吧.呵呵 好久没写文章了,感觉下不了笔吐 ...

  2. JQuery Easyui/TopJUI 创建多级联动下拉框(纯HTML实现!!!)

    JQuery Easyui/TopJUI 创建多级联动下拉框(纯HTML实现!!!) 效果展示: 代码如下: <form data-toggle="topjui-form"& ...

  3. MVC 使用Jquery EasyUI分页成功

    先上图吧

  4. [转]开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo

    热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI. ...

  5. 开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo(转)

    热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI. ...

  6. 使用 EasyUI 创建左侧导航菜单

    使用 JQuery EasyUI 创建左侧导航菜单,菜单的数据由后台服务提供. 效果图 HTML 元素 <div id="menuAccordion"></div ...

  7. Python作业之多级菜单

    作业之多级菜单 菜单实现要求: 1. 列出菜单选择供选择 2. 选择对应内容进入下一级菜单 3. 任何时候都可以选择退出程序或返回上一级菜单 具体代码如下: goods = {'华为':{'A系':{ ...

  8. 记一次艰难的jquery easy-ui ajax post 体验

    分享的经验和教训是: 1.jquery easy-ui ajax post 复杂的Json给后端解析,后端如果接收和解析 2.asp.net webform jquery easy-ui datagr ...

  9. jquery easyui菜单树显示

    目前做了一个easyui项目需要显示多级菜单,菜单配置到数据库中,因此每级菜单都需要到数据库中取,用了jQuery EasyUI方便多了. 效果体验:http://hovertree.com/texi ...

随机推荐

  1. layui js中求某一天距今天有多少天

    <script> lay('#version').html('-v'+ laydate.v); //执行一个laydate实例 laydate.render({ elem: '#test1 ...

  2. 机器学习十大算法之EM算法

    此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于目前论坛的Markdown不支持Mathjax,数学公式没法正常识别,文章只能用截图上传了...     ...

  3. matlab求定积分和不定积分

    matlab求定积分与不定积分 创建于2018-03-21 22:42 求定积分与不定积分是一件比较繁琐的事,但是我们可以借助matlab,下面与大家分享解决方法 材料/工具 matlab 求不定积分 ...

  4. 反射实现数据库增删改查DAO及DAOImpl源代码(一)

    这是DAO层,第一次尝试,如有bug希望能即使反馈,我们共同进步.具体的用法和实现原理我会在前面几篇博客中补充更新.配置文件及项目目录结构会在下一篇中贴出! package com.javasm.su ...

  5. 暴风魔镜SDK:MojingSDK For Unity V1.3.5112 (R).zip

    去年买了个暴风魔镜4,如今一直放在家里吃灰,这些天对Unity3D开发VR兴趣正浓,刚好公司项目不忙,花了几天玩玩暴风魔镜SDK,因为网上的资料不算多,暴风提供的文档也不太适合像我这样的Unity小白 ...

  6. 误删重要文件怎么办?学会Linux 救援模式再也不担心

    背景 在运用Linux时会出现一些误操作,导致系统无法正常使用,比如删除了某个重要依赖库,或者删除了rpm等等.在这里记录下具体的操作步骤,供以后参考. 意义 学会在使用Linux系统出现误删除系统重 ...

  7. idea dao使用@Mapper注解 业务类使用@Autowired 注入dao 爆红问题

    实际项目跑起来无影响,但是看起来不太爽. 可以在dao类添加org.springframework.stereotype.Repository 注解 或者可以在service类中使用 javax.an ...

  8. POJ1845 Sumdiv 数学?逆元?

    当初写过一篇分治的 题意:求A^B的所有因子之和,并对其取模 9901再输出 对于数A=p1^c1+p2^c2+...+pn*cn,它的所有约数之和为(1+p1+p1^2+p1^3+...+p1^(c ...

  9. LeetCode 088 Merge Sorted Array 合并两个有序数组

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.Note:You ...

  10. Spring Cloud下使用Feign Form实现微服务之间的文件上传

    背景 ​ Spring Cloud现在已经被越来越多的公司采用了,微服务架构比传统意义上的单服务架构从复杂度上多了很多,出现了很多复杂的场景.比如,我们的产品是个app,支持第三方登录功能,在手机端调 ...