標籤:
在開發MVC項目中遇到的問題,做許可權控制時,通過MVC的過濾器來實現,所以在分配許可權時希望擷取到所有的控制器和Action方法,通過尋找資料,參考了《Asp.Net MVC架構揭秘》,最終實現。
在C#中,實現動態擷取類和方法主要通過反射來實現,要引用System.Reflection。
1 public ActionResult GetControllerAndAction() 2 List<Type> controllerTypes = new List<Type>(); //建立控制器類型列表 3 var assembly = Assembly.Load("MySoft.UI"); //載入程式集 4 controllerTypes.AddRange(assembly.GetTypes().Where(type => typeof(IController).IsAssignableFrom(type) && type.Name!="ErrorController")); //擷取程式集下所有的類,通過Linq篩選繼承IController類的所有類型 5 StringBuilder jsonBuilder = new StringBuilder(); //建立動態字串,拼接json資料 註:現在json類型傳遞資料比較流行,比xml簡潔 6 jsonBuilder.Append("["); 7 foreach (var controller in controllerTypes)//遍曆控制器類 8 { 9 jsonBuilder.Append("{\"controllerName\":\"");10 jsonBuilder.Append(controller.Name);11 jsonBuilder.Append("\",\"controllerDesc\":\"");12 jsonBuilder.Append((controller.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute)==null?"" : (controller.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description); //擷取對控制器的描述Description13 jsonBuilder.Append("\",\"action\":[");14 var actions = controller.GetMethods().Where(method => method.ReturnType.Name == "ActionResult"); //擷取控制器下所有傳回型別為ActionResult的方法,對MVC的許可權控制只要限制所以的前後台互動請求就行,統一為ActionResult15 foreach (var action in actions)16 {17 jsonBuilder.Append("{\"actionName\":\"");18 jsonBuilder.Append(action.Name);19 jsonBuilder.Append("\",\"actionDesc\":\"");20 jsonBuilder.Append((action.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute) == null ? "" : (action.GetCustomAttribute(typeof(DescriptionAttribute)) as DescriptionAttribute).Description); //擷取對Action的描述21 jsonBuilder.Append("\"},");22 }23 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);24 jsonBuilder.Append("]},");25 }26 jsonBuilder.Remove(jsonBuilder.Length - 1, 1);27 jsonBuilder.Append("]");28 return Content(jsonBuilder.ToString(),"json/text");t");
C#擷取類以及類下的方法(用於Asp.Net MVC)