2009-08-31 25 views
8

Tôi đang cố gắng liệt kê tất cả các bộ điều khiển và hành động của chúng với các thuộc tính cụ thể để tạo một sơ đồ trang web google động. Vì vậy, tôi có thể "đánh dấu" một số hành động nhất định với thuộc tính để chúng hiển thị trong sơ đồ trang web.Asp.net Mvc: Liệt kê tất cả các hành động trên bộ điều khiển với thuộc tính cụ thể

Here Tôi đã tìm hiểu cách nhận tất cả các bộ điều khiển. Nhưng tôi không chắc chắn làm thế nào để có được tất cả các hành động của họ với một thuộc tính cụ thể. Tôi đã thử GetMethods và sau đó sử dụng GetCustomAttributes nhưng tôi không chắc chắn nếu đó là đúng cách để làm điều đó. Nó cảm thấy một chút phức tạp hơn.

Khi tôi nhận được bộ điều khiển và hành động của họ, tôi sẽ sử dụng kỹ thuật được giải thích here để nhận các url. Như bạn có thể thấy Eric Duncan nói về những gì tôi đang cố gắng thực hiện trong câu hỏi đó.

Xin cảm ơn trước.

Trả lời

17

Tôi sử dụng một số mã trong các bài kiểm tra đơn vị của mình để xác minh rằng một số hành động nhất định được trang trí với các thuộc tính. Nó sử dụng sự phản chiếu với một số phương tiện mở rộng tốt đẹp. Tôi nghĩ rằng bạn có thể thích ứng với điều này. Lưu ý, nếu bạn chỉ quan tâm về việc liệu nó có tồn tại hay không, bạn có thể sử dụng Count() trên liệt kê thay vì nhận thuộc tính thực tế. Cách này cho phép bạn linh hoạt trong việc sử dụng các thuộc tính thuộc tính để tùy chỉnh hành vi. Sử dụng cây thừa kế sẽ cho phép bạn trang trí toàn bộ bộ điều khiển.

var methods= controller.GetType() 
         .GetMethods(BindingFlags.Public | BindingFlags.Instance) 
foreach (var info in methods) 
{ 
    if (info.ReturnType == typeof(ActionResult)) 
    { 
     var attribute = info.GetCustomAttributes(typeof(SiteMapAttribute), true) 
          .Cast<SiteMapAttribute>() 
          .FirstOrDefault(); 

     if (attribute != null && !attribute.Exclude.Contains(info.Name)) 
     { 
      ... 
     } 
    } 
} 
Các vấn đề liên quan