v9.8.2018.0605   由DataReader直接映射实体列表,以支持netstandard的MySql和SQLite,且提升性能
大石头 编写于 2018-06-05 00:45:23
X
using System;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;
using NewLife.Reflection;
using NewLife.Web;
using XCode;
using XCode.Membership;

namespace NewLife.Cube
{
    /// <summary>实体树控制器基类</summary>
    /// <typeparam name="TEntity"></typeparam>
    public class EntityTreeController<TEntity> : EntityController<TEntity> where TEntity : EntityTree<TEntity>, new()
    {
        static EntityTreeController()
        {
            var type = typeof(TEntity);
            var all = Entity<TEntity>.Meta.AllFields;
            //var list = new List<FieldItem>();
            var list = ListFields;
            var set = type.GetValue("Setting") as IEntityTreeSetting;
            var k = 0;
            var names = new String[] { set.Key, "TreeNodeName" };
            foreach (var item in names)
            {
                var fi = all.FirstOrDefault(e => e.Name.EqualIgnoreCase(item));
                if (fi != null)
                {
                    if (list.Contains(fi)) list.Remove(fi);
                    list.Insert(k++, fi);
                }
            }

            foreach (var item in all)
            {
                if (set != null && item.Name.EqualIgnoreCase(set.Name, set.Parent))
                {
                    list.Remove(item);
                    continue;
                }

                var pi = type.GetProperty(item.Name);
                if (pi == null || pi.GetCustomAttribute<DisplayNameAttribute>() == null)
                {
                    list.Remove(item);
                    continue;
                }

                //if (!list.Contains(item)) list.Insert(k++, item);
            }

            //ListFields.Clear();
            //ListFields.AddRange(list);
        }

        /// <summary>列表页视图。子控制器可重载,以传递更多信息给视图,比如修改要显示的列</summary>
        /// <param name="p"></param>
        /// <returns></returns>
        protected override ActionResult IndexView(Pager p)
        {
            // 一页显示全部菜单,取自缓存
            p.PageSize = 10000;
            ViewBag.Page = p;

            var list = EntityTree<TEntity>.Root.AllChilds;

            return View("ListTree", list);
        }

        ///// <summary>要导出Xml的对象</summary>
        ///// <returns></returns>
        //protected override Object OnExportXml()
        //{
        //    return EntityTree<TEntity>.Root.Childs;
        //}

        ///// <summary>要导出Json的对象</summary>
        ///// <returns></returns>
        //protected override Object OnExportJson()
        //{
        //    return EntityTree<TEntity>.Root.Childs;
        //}

        /// <summary>上升</summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [DisplayName("上升")]
        [EntityAuthorize(PermissionFlags.Update)]
        public ActionResult Up(Int32 id)
        {
            var menu = FindByID(id);
            menu.Up();

            return RedirectToAction("Index");
        }

        /// <summary>下降</summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [DisplayName("下降")]
        [EntityAuthorize(PermissionFlags.Update)]
        public ActionResult Down(Int32 id)
        {
            var menu = FindByID(id);
            menu.Down();

            return RedirectToAction("Index");
        }

        /// <summary>根据ID查找节点</summary>
        /// <param name="id"></param>
        /// <returns></returns>
        protected static TEntity FindByID(Int32 id)
        {
            var key = EntityTree<TEntity>.Meta.Unique.Name;
            return EntityTree<TEntity>.Meta.Cache.Find(e => (Int32)e[key] == id);
        }
    }
}