2017-12-22 3 views
0

私のTaghelper(asp.net core2.0)でActionのMethodInfoを取得する必要があります。コントローラ、アクション、(または多分エリア)の名前は私が持っている唯一のものです。起動時にすべてのアクションを取得する代わりに。実行時にリフレクションを使用するなど、アクションのMethodInfoを動的に取得する方法はありますか?あなたは次のように、属性のコレクションを構築することができasp.netコアmvc​​のコントローラとアクション名でActionのMethodInfoを取得するには?

+1

あなたは何をしようとしていますか?アクションは、コントローラ内のメソッドになります。タグヘルパーを使用すると、サーバーサイドのコードでRazorファイルで要素を作成してレンダリングすることができます。 – Greg

+0

私はHTMLの "a"タグを拡張しようとしています。タグヘルパーでは、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> 

多少の誤差が、私はすぐにこれを書い存在することがあります。しかし、これは確実な出発点であるはずです。

関連する問題