2017-02-02 5 views
14

私は最近、タグヘルパーをタグヘルパー内で使用したいという状況に遭遇しました。私は周りを見回し、誰かがこれをやろうとしているのを見つけることができませんでした。私は貧しい大会を使用していますか?htmlを返すカスタムタグヘルパーでタグヘルパーを使用できますか?

Ex。 タグヘルパーは、別のタグヘルパーを含むHTMLを出力します。

Ex。

[HtmlTargetElement("tag-name")] 
public class RazorTagHelper : TagHelper 
{ 
    public override void Process(TagHelperContext context, TagHelperOutput output) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("<a asp-action=\"Home\" "); 
     output.Content.SetHtmlContent(sb.ToString()); 
    } 
} 

私は、C#から<a asp-action> </a>タグヘルパーを処理するための方法はありますか?あるいは、タグヘルパーで出力HTMLを再処理するか?

+0

これは助けになるでしょうか? http://stackoverflow.com/questions/32692857/nesting-taghelpers-in-asp-net-core-mvc-6 – Vlince

+0

@Vlinceリンクをありがとうございますが、それは私が探しているものではありません、私はしたいです他のネストされたタグなしで、単一の入力タグを持つこと。私が本当にやりたいことは、別のタグヘルパーを呼び出すことです。 –

+0

万が一[コンポーネントの表示](http://www.davepaquette.com/archive/2016/01/02/goodbyechild-actions-hello-view-components.aspx)をお探しですか? –

答えて

9

できません。 TagHelpersは、Razorの解析時間機能です。

代わりに、TagHelperを作成し、ProcessAsync/Processメソッドを手動で呼び出す方法もあります。別名:これはあなたのシナリオのために働く場合

var anchorTagHelper = new AnchorTagHelper 
{ 
    Action = "Home", 
}; 
var anchorOutput = new TagHelperOutput("a", new TagHelperAttributeList(), (useCachedResult, encoder) => new HtmlString()); 
var anchorContext = new TagHelperContext(
    new TagHelperAttributeList(new[] { new TagHelperAttribute("asp-action", new HtmlString("Home")) }), 
    new Dictionary<object, object>(), 
    Guid.NewGuid()); 
await anchorTagHelper.ProcessAsync(anchorContext, anchorOutput); 
output.Content.SetHtmlContent(anchorOutput); 
+0

これを行う唯一の方法は何か不幸です。私はこの質問を1日ほど開いたままにして、これが私がそれをやらなければならない方法であることを確認するつもりです。別の答えがなければ、私は確かにこれを受け入れるでしょう。ありがとうございます –

+0

私はこの答えが素晴らしいと思います。高度なすべてについては、ビューコンポーネントが必要です。あなたのケースでは、単純に 'UrlHelper'を直接使用する方が良いでしょう@JacobLinney –

+0

@ChristianGollhardtご意見ありがとうございました。私はちょうどこれをするよりよい方法がないことを確認したい。そして、これは私の実際の使用例ではなく、単に抽象化であった。 –

2

は私は知りませんが、AnchorTagHelperを継承し、このようなあなたなカスタマイズを行うことが可能です。

public class TestTagHelper : AnchorTagHelper 
{ 
    public TestTagHelper(IHtmlGenerator htmlGenerator) : base(htmlGenerator) { } 

    public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) 
    { 
     // Replaces <test> with <a> tag 
     output.TagName = "a"; 
     //do custom processing 
     output.Attributes.SetAttribute("class", "custom-class"); 
     //let the base class generate the href 
     base.ProcessAsync(context, output); 
    } 
} 

は、次に、あなただけで、あなたのビューでこのタグヘルパーを使用することができ、すべての組み込みのデフォルトAnchorTagHelperの良さ。

<test asp-action="Index" asp-route-id="5"></test> 
関連する問題