1. 程式人生 > >.Net core 2.0 利用Arrtibute獲取MVC Action來生成選單

.Net core 2.0 利用Arrtibute獲取MVC Action來生成選單

  public class ActionsConfig
    {
        /// <summary>
        /// 是否生成Actions
        /// </summary>
        public static bool GenerateConfigs { get; set; }
        /// <summary>
        /// 是否採用追加模式,如果是追加模式則不刪除現有資料
        /// </summary>
        public static bool IsAppendMode { get; set; }
        
/// <summary> /// 是否更新現有記錄 /// </summary> public static bool IsModifed { get; set; } public static Task<int> GetActions(string[] namespaces) { if (!GenerateConfigs) return new Task<int>(() => 0); DAL.NoteBookContext db = new
DAL.NoteBookContext(); var types = Assembly.GetExecutingAssembly().GetExportedTypes().Where(t => namespaces.Contains(t.Namespace)).ToArray(); var actions = new List<DAL.Entities.Action>(); for (int i = 0; i < types.Length; i++) {
bool isMvcController = types[i].IsSubclassOf(typeof(Controller)); //bool isApiController = types[i].IsSubclassOf(typeof(ApiController)); //if (!isMvcController && !isApiController) continue; var fullName = types[i].FullName; var name = types[i].Name; var areaName = GetAreaName(fullName); var tAttr = types[i].GetCustomAttribute<Attributes.ActionDescriptorAttribute>(); var authorize = types[i].GetCustomAttributes<AuthorizeAttribute>(); string roles = ""; if (authorize != null) roles = string.Join(",", authorize.Select(a => a.Roles)); if (null != tAttr) { string attrName = tAttr.Name; //如果是追加模式需要判斷是否已經存在 bool find = db.Actions.Where(a => a.Name == attrName).Count() > 0; if (!IsAppendMode || !find) actions.Add(new DAL.Entities.Action { Id = Guid.NewGuid(), Name = tAttr.Name, Text = tAttr.Text, Parameter = tAttr.Parameter, AreaName = areaName, ControllerName = name.Substring(0, name.IndexOf("Controller")), ActionName = "#", IsLeaf = tAttr.IsLeaf, IconClass = tAttr.IconClass, Ordinal = tAttr.Ordinal, ShowInLeftNavigationBar = true, Depth = tAttr.Depth, ParentName = tAttr.ParentName, IsLink = tAttr.IsLink, AllowedRoles = roles }); if (find && IsModifed) { DAL.Entities.Action action = db.Actions.Where(a => a.Name == attrName).FirstOrDefault(); action.Text = tAttr.Text; action.Parameter = tAttr.Parameter; action.AreaName = areaName; action.ControllerName = name.Substring(0, name.IndexOf("Controller")); action.ActionName = "#"; action.IsLeaf = tAttr.IsLeaf; action.IconClass = tAttr.IconClass; action.Ordinal = tAttr.Ordinal; action.ShowInLeftNavigationBar = true; action.Depth = tAttr.Depth; action.ParentName = tAttr.ParentName; action.IsLink = tAttr.IsLink; action.AllowedRoles = string.IsNullOrEmpty(roles) || roles == "None" ? null : roles; if (string.IsNullOrEmpty(roles) || roles == "None") action.AllowedRoles = null; db.SaveChanges(); } } var methods = types[i].GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance); for (int j = 0; j < methods.Length; j++) { var mAttr = methods[j].GetCustomAttribute<Attributes.ActionDescriptorAttribute>(); if (null != mAttr) { string attrName = mAttr.Name; //如果是追加模式需要判斷是否已經存在 bool find = db.Actions.Where(a => a.Name == attrName).Count() > 0; if (find && IsModifed) { DAL.Entities.Action action = db.Actions.Where(a => a.Name == attrName).FirstOrDefault(); action.Text = mAttr.Text; action.Parameter = mAttr.Parameter; action.AreaName = areaName; action.ControllerName = name.Substring(0, name.IndexOf("Controller")); action.ActionName = methods[j].Name; action.IsLeaf = mAttr.IsLeaf; action.IconClass = mAttr.IconClass; action.Ordinal = mAttr.Ordinal; action.ShowInLeftNavigationBar = mAttr.ShowInLeftNavigationBar; action.Depth = mAttr.Depth; action.ParentName = mAttr.ParentName; action.IsLink = mAttr.IsLink; action.AllowedRoles = string.IsNullOrEmpty(roles) || roles == "None" ? null : roles; if (string.IsNullOrEmpty(roles) || roles == "None") action.AllowedRoles = null; db.SaveChanges(); } if (find && IsAppendMode) continue; actions.Add(new DAL.Entities.Action { Id = Guid.NewGuid(), Name = mAttr.Name, Text = mAttr.Text, Parameter = mAttr.Parameter, AreaName = areaName, ControllerName = name.Substring(0, name.IndexOf("Controller")), ActionName = methods[j].Name, IsLeaf = mAttr.IsLeaf, IconClass = mAttr.IconClass, Ordinal = mAttr.Ordinal, ShowInLeftNavigationBar = mAttr.ShowInLeftNavigationBar, Depth = mAttr.Depth, ParentName = mAttr.ParentName, IsLink = mAttr.IsLink, AllowedRoles = roles }); } } } var bll = new NoteBookBLL<DAL.Entities.Action>(); if (IsAppendMode) return bll.AddRangeAsync(actions); else return bll.DeleteAsync(a => true).ContinueWith(task => { return bll.AddRangeAsync(actions).Result; }); } private static string GetAreaName(string fullName) { string[] nameSections = fullName.Split(new char[] { '.' }); var areaIndex = Array.IndexOf(nameSections, "Areas", 0); string areaName = null; if (areaIndex > 0) areaName = nameSections[areaIndex + 1]; return areaName; } }