2011-04-26 98 views
4

我想在ASP.NET MVC 3網站上做一個動態菜單功能 - 我想知道是否有一種內置的方式來獲得所有的控制器和操作在運行時?有沒有辦法在ASP.NET MVC3站點中迭代所有控制器/動作?

我意識到我可以使用反射來查找我的控制器上的所有公共方法,但是這並不完全給出我應該放在<a href="...">標記中的相對URL。

此外,我將用指定當前用戶是否可以看到/轉到這些頁面的過濾器屬性來修飾一些「操作」。因此,如果我能夠訪問過濾器以便能夠調用IsAccessGranted()方法,那將是最好的。

我有什麼選擇?什麼是最好的選擇?

回答

1

MVC中沒有內置機制來枚舉所有控制器和操作。您將不得不使用反射來檢查所有加載的類型,並查看它們的方法和相關屬性。當然這是假設你正在使用默認的基於反射的動作調度機制。由於MVC的管道可以在許多地方被替換,所以它很容易注入一個系統來調用不基於CLR類和方法的操作方法。但是,如果你對你的應用程序有完全的控制權,那麼你的生活會更容易。

0

嘗試TVMVC。您仍然必須使用反射,但t4模板將生成一個更容易迭代的類。

3

我其實兩星期前就是這麼做的。

var q = from type in Assembly.GetExecutingAssembly().GetTypes() 
     where type.IsClass && type.Namespace != null && type.Namespace.Contains("Controller") 
     select type; 
     q.ToList().ForEach(type => doWhatYouNeedToDo(type))); 

如果您使用T4MVC,那麼這個腳本將返回雙項。爲了避免這種情況,與

&& !type.Name.Contains("T4MVC") 

工作的方法doWhatYouNeedToDo(),你可以轉換類型對象到適合您需求的DTO,並進一步將其添加工作。

就您的動態菜單而言,您可以使用MvcSiteMapProvider並使用它實現您自己的動態sitemapprovider,因此您不再綁定到靜態站點地圖xml文件。

但是.NET中的反射速度很慢,因此您可能需要將控制器和方法的表示存儲在數據庫中。

相關問題