Cube/NewLife.CubeNC/Common/EntityTreeController.cs

209 lines
6.2 KiB
C#

using System.ComponentModel;
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using NewLife.Cube.ViewModels;
using NewLife.Reflection;
using NewLife.Web;
using XCode;
using XCode.Membership;
namespace NewLife.Cube;
/// <summary>实体树控制器基类</summary>
/// <typeparam name="TEntity"></typeparam>
public class EntityTreeController<TEntity> : EntityTreeController<TEntity, TEntity> where TEntity : EntityTree<TEntity>, new() { }
/// <summary>实体树控制器基类</summary>
/// <typeparam name="TEntity"></typeparam>
/// <typeparam name="TModel"></typeparam>
public class EntityTreeController<TEntity, TModel> : EntityController<TEntity, TModel> 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)
{
list.RemoveField(item);
list.Insert(k++, list.Create(fi));
}
}
foreach (var item in all)
{
if (set != null && item.Name.EqualIgnoreCase(set.Name, set.Parent))
{
list.RemoveField(item.Name);
continue;
}
var pi = type.GetProperty(item.Name);
if (pi == null || pi.GetCustomAttribute<DisplayNameAttribute>() == null)
{
list.RemoveField(item.Name);
continue;
}
//if (!list.Contains(item)) list.Insert(k++, item);
}
//ListFields.Clear();
//ListFields.AddRange(list);
}
/// <summary>验证实体对象</summary>
/// <param name="entity"></param>
/// <param name="type"></param>
/// <param name="post"></param>
/// <returns></returns>
protected override Boolean Valid(TEntity entity, DataObjectMethodType type, Boolean post)
{
var rs = base.Valid(entity, type, post);
// 清空缓存
if (post) Factory.Session.ClearCache($"{type}-{entity}", true);
return rs;
}
/// <summary>设置字段列表</summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
ViewBag.Fields = OnGetFields(ViewKinds.List, null);
base.OnActionExecuting(filterContext);
}
/// <summary>实体树配置</summary>
/// <returns></returns>
protected IEntityTreeSetting GetSetting()
{
//var set = EntityTree<TEntity>.Setting;
var set = typeof(EntityTree<TEntity>).GetValue("Setting") as IEntityTreeSetting;
return set;
}
/// <summary>列表页视图。子控制器可重载,以传递更多信息给视图,比如修改要显示的列</summary>
/// <param name="p"></param>
/// <returns></returns>
protected override ActionResult IndexView(Pager p)
{
var list = SearchData(p);
if (IsJsonRequest) return Json(0, null, list, new { page = p });
return View("ListTree", list);
}
/// <summary>搜索数据集</summary>
/// <param name="p"></param>
/// <returns></returns>
protected override IEnumerable<TEntity> Search(Pager p)
{
// 一页显示全部菜单,取自缓存
if (p.PageSize == 20) p.PageSize = 10000;
var set = GetSetting();
if (set != null && !set.Parent.IsNullOrEmpty())
{
var pkey = p[set.Parent].ToInt(-1);
if (pkey >= 0)
return EntityTree<TEntity>.FindAllChildsByParent(pkey);
}
return EntityTree<TEntity>.Root.AllChilds;
}
///// <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);
if (Valid(menu, DataObjectMethodType.Update, true))
menu.Up();
var set = GetSetting();
if (set != null && !set.Parent.IsNullOrEmpty())
{
var p = WebHelper.Params;
var pkey = p[set.Parent].ToInt(-1);
if (pkey >= 0)
{
var dic = new RouteValueDictionary
{
[set.Parent] = pkey
};
return RedirectToAction("Index", dic);
}
}
return RedirectToAction("Index");
}
/// <summary>下降</summary>
/// <param name="id"></param>
/// <returns></returns>
[DisplayName("下降")]
[EntityAuthorize(PermissionFlags.Update)]
public ActionResult Down(Int32 id)
{
var menu = FindByID(id);
if (Valid(menu, DataObjectMethodType.Update, true))
menu.Down();
var set = GetSetting();
if (set != null && !set.Parent.IsNullOrEmpty())
{
var p = WebHelper.Params;
var pkey = p[set.Parent].ToInt(-1);
if (pkey >= 0)
{
var dic = new RouteValueDictionary
{
[set.Parent] = pkey
};
return RedirectToAction("Index", dic);
}
}
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);
}
}