2011-12-05 71 views
1

我需要掌握另一個控制器上的屬性(即不是當前正在執行的屬性)。要做到這一點有沒有辦法通過ASP.NET MVC3管道獲取控制器類型?

的一種方法如下:

Type controllerType = Type.GetType("App1.UI.Web.Controllers." + controllerName + "Controller", true); 
    object[] controllerAttributes = controllerType.GetCustomAttributes(true); 

是否還有更好的,更不易碎,方式使用MVC管道做?我不想實例化控制器,我只是想要它的屬性。

+0

其中'controllerName'變量來自哪裏?該屬性提供了哪些信息? – wal

+0

你爲什麼試圖訪問與正在執行的控制器不同的控制器? – jrummell

+0

如果您正在管道中,您應該可以使用ControllerDescriptor獲取控制器名稱的名稱,然後使用反射來查找類型及其屬性 – Roman

回答

2

在您滾動得太遠之前,請記住,控制器不必以後綴「Controller」結尾。 MVC控制器的默認命名約定是在類上追加單詞「Controller」。所以你的默認值是「HomeController」和「AboutController」。您可以輕鬆創建一個名爲「MyHome」或「Dashboard」的類,並讓它從Controller繼承,並且它將成爲沒有「Controller」後綴的控制器。

我在過去創建了一個路由約束。下面是我使用的代碼片段:

List<Type> _type = Assembly 
          .GetCallingAssembly() 
          .GetTypes() 
          .Where(type => type.IsSubclassOf(typeof(Controller))) 
          .ToList() 

代碼的作用是在當前程序集中查找所有作爲控制器的類。您還可以添加一些代碼到類似的地方:

.Where(type => type.IsSubclassOf(typeof(Controller)) && type.Name.ToLower() == "homecontroller") 
+0

我會補充說,你可能想要使用一個靜態的IEnumerable(List,數組等)類型,並將Assembly.GetCallingAssembly()。GetTypes()放入它中,然後在類型列表上應用你的where過濾器。這應該會提高速度,因爲它會將列表保留在內存中,具體取決於您需要多長時間調用它。在我看來,它可能是靜態的,因爲類型列表在應用程序生命週期中不應該改變,爲了改變類型,你將不得不部署新的代碼,這會導致應用程序的回收。 –

+0

非常優雅。感謝Splash-x。 – willem

相關問題