2009-08-31 3 views
8

동적 인 Google 사이트 맵을 만들려면 모든 컨트롤러와 해당 작업을 특정 속성과 함께 나열하려고합니다. 그래서 나는 속성으로 특정 행동을 "표시"하여 사이트 맵에 표시 할 수 있습니다.Asp.net Mvc : 특정 속성이있는 컨트롤러의 모든 작업을 나열하십시오.

Here 모든 컨트롤러를 얻는 방법을 찾았습니다. 하지만 특정 속성을 사용하여 액션을 모두 얻는 방법을 모르겠습니다. GetMethods를 시도한 다음 GetCustomAttributes를 사용했지만 올바른 방법인지 확신 할 수 없습니다. 그것은 조금 복잡하게 느껴졌습니다.

컨트롤러와 동작을 얻으면이 기술을 사용하여 here URL을 가져옵니다. 에릭 던컨 (Eric Duncan)이 내가 그 질문에서 성취하려고하는 것에 대해 이야기하는 것을 알 수 있습니다.

미리 감사드립니다.

답변

17

단위 테스트에서 특정 동작이 속성으로 장식되어 있는지 확인하기 위해 일부 코드를 사용합니다. 그것은 열거 가능한 확장 메소드 장점을 가진 리플렉션을 사용합니다. 너도 적응할 수 있다고 생각해. 참고로, 존재 여부에 대해서만 신경 쓰면 실제 속성을 가져 오는 대신 열거 형에서 Count()를 사용할 수 있습니다. 이 방법을 사용하면 속성 속성을 사용하여 동작을 사용자 정의 할 때 유연성을 얻을 수 있습니다. 상속 트리를 사용하면 전체 컨트롤러를 꾸밀 수 있습니다.

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)) 
     { 
      ... 
     } 
    } 
} 
관련 문제