2017-02-02 14 views
14

Kısa bir süre önce bir etiket yardımcısı içinde bir etiket yardımcısı kullanmak istediğim bir duruma girdim. Etrafa baktım ve bunu yapmaya çalışan başka birini bulamadım, fakir bir toplantı mı yapıyorum yoksa belgelerin eksik mi?Bir Etiket Yardımcısı'nı html döndüren özel bir Etiket Yardımcısı'nda kullanabilir miyim?

Ex. Etiket Yardımcısı A, başka bir etiket yardımcısı içeren HTML çıktıları.

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> etiketi yardımcı işlemek için benim için bir yolu var mı? Veya çıkış HTML'sini etiket yardımcılarıyla yeniden işlemek için mi?

+0

Bu herhangi bir yardımcı olabilir mi? http://stackoverflow.com/questions/32692857/nesting-taghelpers-in-asp-net-core-mvc-6 – Vlince

+0

@Vlince Bağlantı için teşekkürler, ama hayır, yapmak istediğim şey değil, ben isterim diğer iç içe geçmiş etiketler olmadan tek bir giriş etiketine sahip olmak. Gerçekten yapmak istediğim, bir etiket yardımcısını diğerinden aramak. –

+0

Herhangi bir olasılıkla [Görüntüle Bileşenleri] (http://www.davepaquette.com/archive/2016/01/02/goodbye-child-actions-hello-view-components.aspx) arıyorsunuz? –

cevap

9

Hayır yapamazsınız. TagHelpers, bir Jilet ayrıştırma zamanı özelliğidir.

Bir alternatif, bir TagHelper yaratıyor ve ProcessAsync/Process yöntemini el ile çağırıyor. Aka:

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

Mümkünse etiket yardımcılarının HTML-esque sözdizimini tutmak isterim Ne yazık ki, bunu yapmanın tek yolu bu talihsiz durumdur. Bu soruyu bir günlüğüne açık bırakacağım ya da bunu yapmak zorunda olduğumdan emin olmak için. Başka bir cevap yoksa, bunu kesinlikle kabul edeceğim. Teşekkürler –

+0

Bu cevabın harika olduğunu düşünüyorum. Gelişmiş olan her şey için, viewcomponents gitmenin yoludur. Sizin durumunuz için, basit kullanımı 'UrlHelper' doğrudan daha iyi olabilir @JacobLinney –

+0

@ChristianGollhardt Görüş ve öneriniz için teşekkür ederiz; Sadece bunu yapmanın daha iyi bir yolu olmadığını doğrulamak istiyorum. Ve bu benim gerçek kullanım durumum değildi, sadece bir soyutlama. –

2

Bu senaryo için çalışıyorsa bilmiyorum, ama böyle senin özelleştirmeler AnchorTagHelper devralan ve sonra yapmak mümkündür.

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); 
    } 
} 

Sonra sadece ile görünümünde bu etiket yardımcısı kullanabileceğiniz tüm yerleşik varsayılan AnchorTagHelper iyiliği.

<test asp-action="Index" asp-route-id="5"></test> 
İlgili konular