有沒有辦法讓我的MVC 3項目的所有操作方法列表?MVC獲取所有操作方法
3
A
回答
7
您可以在運行時使用,以反映對組件的生產方法列表中返回的ActionResult控制器:
public IEnumerable<MethodInfo> GetMvcActionMethods()
{
return
Directory.GetFiles(Assembly.GetExecutingAssembly().Location)
.Select(Assembly.LoadFile)
.SelectMany(
assembly =>
assembly.GetTypes()
.Where(t => typeof (Controller).IsAssignableFrom(t))
.SelectMany(type => (from action in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)
where action.ReturnType == typeof(ActionResult)
select action)
)
);
}
這會給你的行動,而不是瀏覽列表(即它如果您可以在每個操作中使用不同的視圖,則不起作用)
+1
此方法將不包括返回「FileContentResult」,「JsonResult」,... 的行動方法請參閱我的迴應低於 – Moeri 2013-06-11 13:04:56
8
這將爲您提供一個字典,其中控件類型爲鍵,其MethodInfos的IEnumerable爲值。
var assemblies = AppDomain.CurrentDomain.GetAssemblies(); // currently loaded assemblies
var controllerTypes = assemblies
.SelectMany(a => a.GetTypes())
.Where(t => t != null
&& t.IsPublic // public controllers only
&& t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) // enfore naming convention
&& !t.IsAbstract // no abstract controllers
&& typeof(IController).IsAssignableFrom(t)); // should implement IController (happens automatically when you extend Controller)
var controllerMethods = controllerTypes.ToDictionary(
controllerType => controllerType,
controllerType => controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType)));
它看起來不僅僅是當前程序集,它還會返回方法,例如返回JsonResult而不是ActionResult。 (JsonResult實際上是從繼承的ActionResult)
編輯:對於Web API支持
變化
&& typeof(IController).IsAssignableFrom(t)); // should implement IController (happens automatically when you extend Controller)
到
&& typeof(IHttpController).IsAssignableFrom(t)); // should implement IHttpController (happens automatically when you extend ApiController)
,並刪除此:
.Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType))
要導致Web API方法可以返回任何東西。 (POCO的,HttpResponseMessage,...)
相關問題
- 1. Asp.NET MVC ModelBinder,獲取操作方法
- 2. MVC Post操作方法沒有觸發
- 3. 從AzMan獲取所有操作
- 4. MVC操作方法和Javascript
- 5. MVC輸入操作方法
- 6. Asp.net MVC獲取操作方法的完全限定URL
- 7. 如何使用節點js中的方法獲取所有js文件操作
- 8. 獲取當操作符重載,甚至定義的所有方法
- 9. ASP.NET MVC操作未獲取參數值
- 10. 獲取所有培訓的方法
- 11. CodeIgniter MVC數據操作最佳方法
- 12. 在ASP MVC的WebAPI操作方法
- 13. 如何從操作的MethodInfo獲取MVC操作信息?
- 14. 獲取所有區域,控制器和操作作爲樹
- 15. 獲取解決方案中所有方法參數的方法
- 16. 如何使用文件操作方法在ASP.NET MVC中獲取文件的ContentType
- 17. 在ASP.Net視圖中獲取控制器和操作方法的名稱MVC
- 18. 傳遞操作符作爲參數來獲取方法
- 19. 爲什麼取消所有操作不會刪除所有操作?
- 20. Elgg,如何獲得所有操作?
- 21. 最佳方法:每個操作一個表或所有操作一個表?
- 22. 表單操作沒有打到MVC控制器方法
- 23. 有什麼方法來重寫MVC控制器操作?
- 24. 具有可爲空參數的MVC操作方法
- 25. 有沒有簡單的方法來獲取瀏覽器和操作系統?
- 26. 有沒有一種方法來獲取URL引用的模塊/操作?
- 27. Yii RBAC獲取指定角色的所有操作?
- 28. 查詢以獲取每小時期間的所有操作
- 29. 制定控制器的所有操作方法ChildActionOnly
- 30. 無法獲取MVC控制器中的所有ajax參數
在運行時還是在VS? – Richard 2011-04-27 09:08:22
你是指動作還是視圖?如果您的意思是視圖,您是否包含部分視圖?還有哪個viewengine?如果您使用默認值,那麼您可以使用反射來獲取從System.Web.Mvc.ViewPage或ViewPage繼承的程序集/命名空間中的每個類的列表。您可以執行相同類型的操作 - 使用反射來標識從Controller繼承的所有類以及返回ActionResult派生的所有公共方法。 –
RichardW1001
2011-04-27 09:20:06
我想在VS的行動 – 2011-04-27 09:44:28