MVC管理系列

本篇将要和我们享受的是一个简单的后台管理体系,那里头阵个地点http://www.lovexins.com:8081/(登陆账号:youke,密码:12312三;高级用户账号:gaoji,密码:1231贰3)有趣味的诸位能够先不难看下效果,此系统选取:Ace的h5样式+Mvc5.0
+
redis+sqlserver+shenniu.pager.js营造完结,创设此项目初衷为了有1套本身现成的h5后台系统,为了现在能高效支付搭建部分系统;项目源码近来不开源(完善后开源),假诺你的确承认依旧想钻探下,能够扫博客下方2维码扶助一下收获源码(哪怕一分钱都可),当然此小说主要指标不是为了广告,而是为了分享部分器重大概常用的代码处理格局,希望大家喜爱,多多帮助:

 

. Controller中动用自带生成的Dispose(bool)好与坏

. List集合生成权限树

. 比较集合,加载checkboxlist

. 为什么使用redis来保存session

 

下边一步3个脚印的来享受:

. Controller中使用自带生成的Dispose(bool)好与坏

先是,咋们先来看下mvc模板自动生成的Dispose重写方法:

1        protected override void Dispose(bool disposing)
2         {
3             if (disposing)
4             {
5                 db.Dispose();
6             }
7             base.Dispose(disposing);
8         }

因为Controller达成了接口IDisposable,所以里面能够应用Dispose方法,再看db.dispose()这是用来刑释连接数据库对象的,假设条分缕析的心上人能够在调节的时候发现,大家在进行有些连接数据库操作后,退出action的时候会进来那个重新的Dispose方法中去,首要目标用来刑满释放解除劳教在Controller最下面生成的总是数据库对象,笔者那边是:

图片 1

看来这里个人觉吧这几个目的放在那使用起来挺便宜的,然则带来三个标题便是,要是在工作逻辑复杂的地点,直接动用那一个db,直到最终执行完全体action退出Controller的时候才dispose释放连接会不会有毛病,心中存疑,再添加先天看了一篇博文,分享的始末大致有那般的字样:ef不必要动用using(原理约等于dispose)自个儿就能在操作完数据库后放走,原因底层已经落到实处了那些dispose;如此更令人感觉直接在Controller类上面表明数据库链接方便的很,但试为啥微软mvc模板Controller中会再自带四个dispose方法吧,那三种情景存在不消除的传教,当然明日的最主要指标不是为着表明那二种到底哪个是对的,此小说近期以自动生成的dispose为客体说法来分享内容(注:朋友们请勿抠字眼);

联机来看,要是自动模板生成的上上下下靠Controller重写的那一个dispose来释放数据连接,那么在多事情逻辑下,比如自身在登陆的时候大家除了相配唯1用户外,还必要记录获取权力树,加入redis的session储存当中等操作,不容许等那个操作完了再来释放数据连接,那样登六用户多了自然会有标题吗,假设是这种场地包车型客车标题,也许不得不通过在某处操作数据库后即时释放连接了;以上是格式观点和观点,可能有不妥之处,请联系指正,感激,特别是using真的不须要吗那几个难题;

 

. List集合生成权限树

先是,笔者那边定义了七个一定的实体:

图片 2图片 3

 /// <summary>
        /// 菜单类
        /// </summary>
        public class MoMenu
        {

            /// <summary>
            /// 菜单Id (必填)
            /// </summary>
            public int Id { get; set; }

            /// <summary>
            /// 名称
            /// </summary>
            public string Name { get; set; }

            /// <summary>
            /// 链接地址 (建议填写,每个需要登录访问的Action需要使用这个对比是否有权限)
            /// </summary>
            public string Link { get; set; }

            /// <summary>
            /// 描述
            /// </summary>
            public string Des { get; set; }

            /// <summary>
            /// 图标样式,对应StageClass.MoIcon
            /// </summary>
            public string Icon { get; set; }

            /// <summary>
            /// 排序(升序)
            /// </summary>
            public int Sort { get; set; }

            /// <summary>
            /// 父级菜单Id,最顶层父级默认0
            /// </summary>
            public int ParentId { get; set; }

            /// <summary>
            /// 是否导航栏
            /// </summary>
            public bool IsMenu { get; set; }

            /// <summary>
            /// 菜单子级集合
            /// </summary>
            public List<MoMenu> ListMenu { get; set; }
        }

View Code

首要用以装系统中具有菜单的数额,并且区分层级关系,然后通过如下方法:

 1 /// <summary>
 2         /// List集合生成菜单树
 3         /// </summary>
 4         /// <typeparam name="T">对比选中菜单的对象</typeparam>
 5         /// <param name="html"></param>
 6         /// <param name="list">系统全部菜单(需要有层级关系)</param>
 7         /// <param name="name">生成的checkboxlist的name</param>
 8         /// <param name="checkList">选中菜单的集合</param>
 9         /// <param name="defValFiled">选中匹配的默认值</param>
10         /// <param name="isEnable">是否启用(查看状态不需要启用)</param>
11         /// <param name="nLoop">循环层次(可能多余的吧)</param>
12         /// <returns></returns>
13         public static MvcHtmlString CheckBoxMenuByList<T>(
14             this HtmlHelper html,
15             List<StageModel.MoMenu> list,
16             string name = "RadStatus",
17             IEnumerable<T> checkList = null,
18             string defValFiled = "Id",
19 
20             bool isEnable = true,
21             int nLoop = 0)
22             where T : class ,new()
23         {
24             var sbHtml = new StringBuilder(string.Empty);
25             sbHtml.AppendFormat("<ul class='divmenu' style=\"list-style:none;{0}\">", nLoop <= 0 ? "display:block" : "display:none");
26             foreach (var item in list)
27             {
28                 var isCheck = false;
29                 if (checkList != null)
30                 {
31                     foreach (var checkItem in checkList)
32                     {
33                         var ty = checkItem.GetType();
34                         var val = ty.GetProperty(defValFiled).GetValue(checkItem, null);
35                         isCheck = val.ToString().Equals(item.Id.ToString());
36                         if (isCheck) { break; }
37                     }
38                 }
39 
40                 sbHtml.Append("<li>");
41                 sbHtml.AppendFormat("<input id=\"{0}{1}\" name=\"{0}\" type=\"checkbox\" value=\"{1}\" {3} {4}/><label>{2}<b>{5}</b></label>",   // class=\"arrow fa fa-angle-down\"
42                     name,
43                     item.Id,
44                     item.Name,
45                     isCheck ? "checked=\"checked\"" : "",
46                     isEnable ? "" : "disabled=\"disabled\"",
47 
48                     item.ListMenu == null ? "" : (item.ListMenu.Count > 0 ? string.Format("[{0}]", item.ListMenu.Count) : "")
49                     );
50                 if (item.ListMenu == null) { sbHtml.Append("</li>"); continue; }
51                 if (item.ListMenu.Count > 0)
52                 {
53                     sbHtml.Append(CheckBoxMenuByList(html, item.ListMenu, name, checkList, defValFiled, isEnable, isCheck ? 0 : nLoop++));
54                 }
55                 sbHtml.Append("</li>");
56             }
57             sbHtml.Append("</ul>");
58             return MvcHtmlString.Create(sbHtml.ToString());
59         }

遍历生成菜单树,成效有:1.在翻看意况即可使其禁止使用选用,2.编辑状态十三分对象选中菜单;然后须求在准备中追加如js代码:

1 $("ul[class='divmenu'] li input[type='checkbox']").on("click", function () {
2 
3             var isCheck = $(this).is(":checked");
4             //子级
5             $(this).nextAll("ul").find("li input[type='checkbox']").prop("checked", isCheck);
6         });
7         $("ul[class='divmenu'] li label").on("click", function () {
8             $(this).next("ul[class='divmenu']").toggle("normal");
9         });

末尾,只必要在需求运用该菜单树的地方添加代码如: @Html.CheckBoxMenuByList(Stage.Com.Extend.StageClass.GetAllMenus(),
“MenuIds”, Model.MoRoleAndMenus, “MenuId”) 即可,看到的效果图:

图片 4

切实大家能够登6ShenNiu.MVC试试效果

 

. 比较集合,加载checkboxlist

首先,直接贴代码如:

 1 /// <summary>
 2         /// 对比集合,加载checkboxlist
 3         /// </summary>
 4         /// <typeparam name="T">目标对象</typeparam>
 5         /// <param name="html"></param>
 6         /// <param name="orgList">目标集合</param>
 7         /// <param name="orgFiledVal">目标对应checkbox的value值的属性名称</param>
 8         /// <param name="orgFiledText">对应的checkbox文本的text值的属性名称</param>
 9         /// <param name="destList">匹配集合</param>
10         /// <param name="destFiled">匹配列的属性名称</param>
11         /// <param name="sClass">样式</param>
12         /// <param name="name">checkboxlist的Name</param>
13         /// <returns></returns>
14         public static MvcHtmlString CheckBoxRoleByList<T, TT>(
15             this HtmlHelper html,
16             IEnumerable<T> orgList,
17             string orgFiledVal,
18             string orgFiledText,
19 
20             IEnumerable<TT> destList = null,
21             string destFiled = "",
22 
23             string sClass = "",
24             string name = "cbAll")
25             where T : class ,new()
26             where TT : class,new()
27         {
28             var sbHtml = new StringBuilder(string.Empty);
29             if (orgList.Count() <= 0) { return MvcHtmlString.Create(string.Empty); }
30 
31             sbHtml.AppendFormat("<div class=\"{0}\">", sClass);
32             foreach (var item in orgList)
33             {
34                 var ty = item.GetType();
35                 var val = ty.GetProperty(orgFiledVal).GetValue(item, null);
36                 var text = ty.GetProperty(orgFiledText).GetValue(item, null);
37 
38                 var isMatch = false;
39                 if (destList != null)
40                 {
41                     foreach (var destItem in destList)
42                     {
43                         var destty = destItem.GetType();
44                         var destval = destty.GetProperty(destFiled).GetValue(destItem, null);
45 
46                         if (val.ToString().ToUpper().Equals(destval.ToString().ToUpper()))
47                         {
48                             isMatch = true;
49                             break;
50                         }
51                     }
52                 }
53                 sbHtml.AppendFormat("<label><input type='checkbox' name='{0}' value='{1}' {3} />{2}</label>", name, val, text, isMatch ? "checked='checked'" : "");
54             }
55             sbHtml.Append("</div>");
56             return MvcHtmlString.Create(sbHtml.ToString());
57         }

利用编辑页面包车型地铁成效图如:

图片 5

总的来看作用是暗中同意绑定了该用户对应的权力“高级用户”,代码要求珍视是:

1  var ty = item.GetType();
2  var val = ty.GetProperty(orgFiledVal).GetValue(item, null);
3  var text = ty.GetProperty(orgFiledText).GetValue(item, null);

重大成效就是点名特定的本性,获取特定属性的value值;item是List集合中的某部对象,具体参数表达可以看下代码备注;

 

. 为何使用redis来保存session

本条小标题不好定义,笔者个人的观点,大家能够看看罢了;一:redis存款和储蓄数据足以安装失效时间,那就类似于session失效的效应同样,所以redis能很好的来作为session容器;二:用位置一点大家能够再追加nginx等分布式服务,以此来打架一个分布式架构,那样在更新子系统的时候不会促成所以的政工瘫痪,能够不对用户的操作造成阻碍,就好像未有更加细过相同;三:基于redis搭建session服务器后session服务器这年能够独自分到此外壹台服务器上,这样收缩了内部存款和储蓄器占有率,应用程序和session分布七个服务器,大大提升承载率,不至于说怎么千万级别就把你系统cpu爆满了,session还各样丢失的处境;4.应用redis打斗服务后方可动用多余空间存款和储蓄一些相当长变动的数量和消息,列如:系统中的菜单栏,一些音讯提示,邮件发送等数码,都足以应用其保存;

以上是私人住房的意见和小结,希望能对我们有扶助;由于自己经验有限,如有不客观的地方请多多指正,谢谢。

发表评论

电子邮件地址不会被公开。 必填项已用*标注