2009-07-20 23 views
31

Trong ASP.NET MVC có cách nào để liệt kê các bộ điều khiển thông qua mã và lấy tên của chúng?ASP.NET MVC lập trình có được một danh sách các bộ điều khiển

dụ:

AccountController 
HomeController 
PersonController 

sẽ cung cấp cho tôi một danh sách như:

Account, Home, Person 
+1

ASP.Net MVC là đã làm điều này, (tức là nó là cách tên điều khiển được phát hiện) nếu bạn có thể tận dụng việc thực hiện hiện tại trong MVC nó có lẽ sẽ giúp bạn tiết kiệm một chút thời gian. –

+1

đó là một câu hỏi tuyệt vời ở đây - làm thế nào tôi sẽ làm điều đó? –

Trả lời

12

Bạn có thể phản ánh thông qua lắp ráp và tìm tất cả các lớp kế thừa từ loại System.Web.MVC.Controller. Dưới đây là một số mẫu mã cho thấy làm thế nào bạn có thể làm điều đó:

http://mvcsitemap.codeplex.com/WorkItem/View.aspx?WorkItemId=1567

+0

. bằng cách sử dụng phương pháp này. Tôi cũng lưu trữ danh sách vì nó sẽ được tái sử dụng thường xuyên. Cảm ơn – DennyFerra

-1

Tạo thuộc tính trong mỗi bộ điều khiển và sau đó bạn sẽ có được cái tên như thế này.

+0

Đây là một ý tưởng hay, nếu hiệu suất là một vấn đề, thì cách của bạn có lẽ là cách tiếp cận tốt nhất (giả sử bạn không sử dụng sự phản chiếu để khám phá các triển khai). Nếu không, sử dụng sự phản chiếu để lấy tên lớp của việc triển khai là dễ nhất. –

+0

cảm ơn bạn đã chia sẻ kiến ​​thức. – KuldipMCA

+0

Thay vì dán điều này vào mọi bộ điều khiển, bạn có thể tạo lớp điều khiển của riêng bạn và làm cho tất cả các bộ điều khiển của bạn trở thành một trong lớp này, và điều duy nhất bạn đưa vào đó không nằm trong lớp bộ điều khiển cơ sở là thuộc tính ViewName này –

42

Sử dụng Jon's suggestion of reflecting through the assembly, đây là một đoạn bạn có thể thấy hữu ích:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 
using System.Web.Mvc; 

public class MvcHelper 
{ 
    private static List<Type> GetSubClasses<T>() 
    { 
     return Assembly.GetCallingAssembly().GetTypes().Where(
      type => type.IsSubclassOf(typeof(T))).ToList(); 
    } 

    public List<string> GetControllerNames() 
    { 
     List<string> controllerNames = new List<string>(); 
     GetSubClasses<Controller>().ForEach(
      type => controllerNames.Add(type.Name)); 
     return controllerNames; 
    } 
} 
0

Tất cả những ai sử dụng bài này đọc tốt hơn bài này trước khi : using Assembly.GetCallingAssembly() not returns the calling assembly

Vấn đề là chế độ xem dao cạo hoạt động như cụm động lực độc lập và bạn không nhận được lắp ráp mong muốn.

Yair

+2

Tôi sẽ không gọi điều này từ chế độ xem, tôi sẽ chuyển thông tin từ viewmodel của tôi, làm như vậy sẽ giảm thiểu vấn đề của bạn. –

Các vấn đề liên quan