2012-07-02 12 views
12

Làm cách nào để có danh sách tất cả các hành động của Bộ điều khiển? Tôi tìm kiếm nhưng không thể tìm thấy ví dụ/câu trả lời. Tôi thấy một số ví dụ được khuyến nghị sử dụng sự phản chiếu nhưng tôi không biết làm thế nào.Làm cách nào để có được danh sách tất cả các hành động của Bộ điều khiển MVC bằng cách truyền Tên bộ điều khiển?

Dưới đây là những gì tôi đang cố gắng để làm:

public List<string> ActionNames(string controllerName){ 




} 
+0

Tôi sẽ đưa ra nhận xét ở đây, bởi vì nó chung chung. Đối với những gì bạn đang cố gắng làm (tên hành động điều khiển) không phải là cách mà nó nên được thực hiện. Có thể có một số hành động có cùng tên và một số có thể chỉ là Ajax, v.v. Quyền của bạn phải dựa trên những thứ khác ngoài hành động của bộ điều khiển. –

Trả lời

21

Bạn chưa nói với chúng tôi lý do tại sao bạn cần điều này nhưng một khả năng là sử dụng phản ánh:

public List<string> ActionNames(string controllerName) 
{ 
    var types = 
     from a in AppDomain.CurrentDomain.GetAssemblies() 
     from t in a.GetTypes() 
     where typeof(IController).IsAssignableFrom(t) && 
       string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase) 
     select t; 

    var controllerType = types.FirstOrDefault(); 

    if (controllerType == null) 
    { 
     return Enumerable.Empty<string>().ToList(); 
    } 
    return new ReflectedControllerDescriptor(controllerType) 
     .GetCanonicalActions().Select(x => x.ActionName) 
     .ToList(); 
} 

Rõ ràng như chúng ta biết suy nghĩ không phải là rất nhanh vì vậy nếu bạn có ý định gọi phương pháp này thường bạn có thể xem xét cải thiện nó bằng cách lưu trữ bộ nhớ danh sách các bộ điều khiển để tránh tìm nạp nó mọi lúc và thậm chí memoizing phương thức cho các tham số đầu vào đã cho.

+0

Cảm ơn bạn !!! Trong ứng dụng của tôi, tôi cần tạo trang quyền cho người dùng quản trị. Admin sẽ chọn tên bộ điều khiển từ danh sách thả xuống, danh sách hành động sẽ tự động hiển thị dựa trên tên bộ điều khiển đã chọn. Sau đó, gán giá trị đó cho người dùng/vai trò. – nannypooh

+0

Tôi gặp lỗi "từ t trong a.GetTypes() - Không thể tải một hoặc nhiều loại được yêu cầu." – nannypooh

+0

Điều đáng nói là phương thức GetCanonicalActions của ReflectedControllerDescriptor sẽ trả về một ActionDescriptor cho mọi phương thức công khai trên bộ điều khiển, bao gồm các phương thức không phải là các hành động. Nó cũng bỏ qua NonActionAttribute. – rossisdead

0

Một chút tinh chỉnh đối với câu trả lời của Darin. Tôi cần sự thay đổi này để có được điều này để làm việc với mã lense khi nó chạy theo một hội đồng khác nhau.

public static List<string> GetAllActionNames(string controllerName) 
{ 
    var controllerType = Assembly.Load("YourAssemblyNameHere") 
     .GetTypes() 
     .FirstOrDefault(x => typeof(IController).IsAssignableFrom(x) 
      && x.Name.Equals(controllerName + "Controller", StringComparison.OrdinalIgnoreCase)); 

    if (controllerType == null) 
    { 
     return Enumerable.Empty<string>().ToList(); 
    } 
    return new ReflectedControllerDescriptor(controllerType) 
     .GetCanonicalActions().Select(x => x.ActionName) 
     .ToList(); 
}