2017-12-22 20 views
0

내 Taghelper (asp.net core2.0)에서 Action의 MethodInfo를 가져와야합니다. 컨트롤러, 액션, (또는 아마도 영역) 이름은 내가 가진 유일한 것입니다. 시작할 때 모든 작업을 수행하는 대신. 런타임에 동작의 MethodInfo (리플렉션 사용)를 동적으로 가져 오는 방법이 있습니까?asp.net 코어 mvc에서 컨트롤러 및 동작 이름별로 Action의 MethodInfo를 얻는 방법은 무엇입니까?

다음과 같은 방식으로, 속성의 컬렉션을 만들 수
+1

무엇을하려고합니까? 액션은 컨트롤러 내의 메소드입니다. 태그 도우미를 사용하면 서버 측 코드에서 Razor 파일로 요소를 만들고 렌더링 할 수 있습니다. – Greg

+0

HTML "a"태그를 확장하려고합니다. taghelper에서 asp-controller 및 asp-item 속성을 얻을 수 있습니다. 내 작업에 CustomAttribute를 추가했습니다. 이제는 주어진 CustomAttribute를 가져와야하는데, 주어진 컨트롤러와 액션 이름에 의해 MethodInfo를 먼저 가져와야한다고 생각합니다. – jyshih

+0

하이퍼 링크에 메서드 정보를 표시하면 어떤 이점이 있습니까? 또는 링크에 설명 된 메서드와 관련된 사용자 지정 특성을 사용하려고합니까? – Greg

답변

0

: 당신이 속성을 만든 경우 위의 대한

publicstring GetHyperlinkAttributes<TEntity>(string name) 
{ 
    PropertyInfo property = typeof(TEntity).GetProperty(name); 
    object[] attributes = property.GetCustomAttributes(false); 

    var collection = new List<string>(); 
    foreach(Attribute attribute in attributes) 
    { 
      var hyperlink = attribute as HyperlinkAttribute; 
      if(!string.IsNullOrEmpty(hyperlink?.Target) 
       return hyperlink.Target; 
    } 

    return String.Empty; 
} 

따라서는, 당신이 전달 한 개체의 특성 Target를 찾을 것 name 파라미터를 개입시킨 지정된 프로퍼티의 메소드 확장하려는 경우 typeof(TEntity).GetProperties()을 통해 전체 개체를 반복 할 수 있습니다.

GetCustomAttributes이 일부 속성을 추가하여 속성에있는 모든 속성을 반환합니다. 따라서 캐스트가있는 행은 개발자가 HyperLinkAttribute 속성을 필드에 추가하는 경우에 사용됩니다. 이것은 정리 될 수 있지만 함정에 당신을 알려주겠다고 생각했습니다.

그래서 다음과 같은 경우

이 존재 :

[Target("https://microsoft.com")] 
public string Example { get; set; } 

위의 방법은 https://microsoft.com을 반환합니다.

이제 까다로운 부분 - 태그 도우미. 내가 탐색이라는 객체를 생성,이 예에서

  • :
    public class TargetTagHelper : TagHelper 
    { 
        public string DestinationName { get; set; } 
    
        public override Process(TagHelperContext context, TagHelperOutput output) 
        { 
          output.TagName = "a"; 
    
          var url = GetHyperLinkAttributes<Navigation>(DestinationName); 
          output.Attributes.SetAttribute("href", url); 
          output.Content.SetContent(url); 
        } 
    } 
    

    은 그래서 위의 목표를 달성하지만, 몇 가지 단점이있다.
  • 속성을 찾으려면 올바른 값을 마크 업해야합니다.
  • 특성 또는 개체가 올바르게 매핑되지 않은 경우 문제 해결이 어려우며 쉽게 손상됩니다.

하지만 그 한계가 좋은 경우, 그것은 허용해야한다 :

<target destination-name="Microsoft">Microsoft</target> 

일부 오류가 나는 빨리 쓴 존재 할 수있다. 그러나 이것은 견고한 출발점이되어야합니다.