Pomocné rutiny značek author in ASP.NET Core

Autor: Rick Anderson

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Začínáme s pomocnými rutinami značek

Tento kurz obsahuje úvod do programovacích pomocných rutin značek. Úvod do pomocných rutin značek popisuje výhody, které poskytují pomocníci značek.

Pomocná rutina značky je libovolná třída, která implementuje ITagHelper rozhraní. Když však vytvoříte pomocnou rutinu značky, obvykle odvozujete z TagHelpernich , tím získáte přístup k Process metodě.

  1. Vytvořte nový projekt ASP.NET Core s názvem AuthoringTagHelpers. Pro tento projekt nebudete potřebovat ověřování.

  2. Vytvořte složku pro uložení pomocných rutin značek s názvem TagHelpers. Složka TagHelpers není nutná, ale je to rozumná konvence. Teď začneme psát několik jednoduchých pomocných rutin značek.

Minimální pomocná rutina značek

V této části napíšete pomocnou rutinu značky, která aktualizuje e-mailovou značku. Příklad:

<email>Support</email>

Server použije pomocnou rutinu e-mailové značky k převodu této značky na následující:

<a href="mailto:Support@contoso.com">Support@contoso.com</a>

To znamená, že značka ukotvení, která vytvoří tento e-mailový odkaz. Můžete to udělat, pokud píšete blogový modul a potřebujete ho poslat e-mail pro marketing, podporu a další kontakty, všechny do stejné domény.

  1. Do složky TagHelpers přidejte následující EmailTagHelper třídu.

    
    using Microsoft.AspNetCore.Razor.TagHelpers;
    using System.Threading.Tasks;
    
    namespace AuthoringTagHelpers.TagHelpers
    {
        public class EmailTagHelper : TagHelper
        {
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                output.TagName = "a";    // Replaces <email> with <a> tag
            }
        }
    }
    
    • Pomocné rutiny značek používají konvenci pojmenování, která cílí na prvky názvu kořenové třídy (minus část TagHelper názvu třídy). V tomto příkladu je kořenový název EmailTagHelper e-mailem, takže <email> značka bude cílená. Tato konvence vytváření názvů by měla fungovat pro většinu pomocných rutin značek, později si ukážeme, jak ji přepsat.

    • Třída EmailTagHelper je odvozena z TagHelper. Třída TagHelper poskytuje metody a vlastnosti pro psaní pomocných rutin značek.

    • Přepsaná Process metoda řídí, co pomocník značky dělá při spuštění. Třída TagHelper také poskytuje asynchronní verzi (ProcessAsync) se stejnými parametry.

    • Kontextový parametr ( Process a ProcessAsync) obsahuje informace spojené se spuštěním aktuální značky HTML.

    • Výstupní parametr pro Process (a ProcessAsync) obsahuje stavový element HTML představující původní zdroj použitý k vygenerování značky HTML a obsahu.

    • Název naší třídy má příponu TagHelper, která není nutná, ale považuje se za osvědčený postup. Třídu můžete deklarovat jako:

    public class Email : TagHelper
    
  2. Pokud chcete třídu zpřístupnit EmailTagHelper všem našim Razor zobrazením, přidejte do souboru direktivu addTagHelperViews/_ViewImports.cshtml :

    @using AuthoringTagHelpers
    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @addTagHelper *, AuthoringTagHelpers
    

    Výše uvedený kód používá syntaxi zástupných znaků k určení všech pomocných rutin značek v našem sestavení bude k dispozici. První řetězec po @addTagHelper zadání pomocné rutiny značky k načtení (použít "*" pro všechny pomocné rutiny značek) a druhý řetězec AuthoringTagHelpers určuje sestavení, ve které je pomocná rutina značky. Všimněte si také, že druhý řádek přináší pomocné rutiny značek ASP.NET Core MVC pomocí syntaxe zástupných znaků (tyto pomocné rutiny jsou popsány v úvodu k pomocným rutinám značek.) Je to direktiva @addTagHelper , která zpřístupňuje pomocné rutině značek pro Razor zobrazení. Případně můžete zadat plně kvalifikovaný název (FQN) pomocné rutiny značek, jak je znázorněno níže:

@using AuthoringTagHelpers
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper AuthoringTagHelpers.TagHelpers.EmailTagHelper, AuthoringTagHelpers

Pokud chcete do zobrazení přidat pomocnou rutinu značek pomocí plně kvalifikovaného názvu domény, nejprve přidejte plně kvalifikovaný název domény (AuthoringTagHelpers.TagHelpers.EmailTagHelper) a pak název sestavení (AuthoringTagHelpers, ne nutně namespace). Většina vývojářů preferuje použití syntaxe zástupných znaků. Úvod do pomocných rutin značek obsahuje podrobné informace o přidávání, odebírání, hierarchii a syntaxi zástupných znaků.

  1. Aktualizujte kód v Views/Home/Contact.cshtml souboru těmito změnami:

    @{
        ViewData["Title"] = "Contact";
    }
    <h2>@ViewData["Title"].</h2>
    <h3>@ViewData["Message"]</h3>
    
    <address>
        One Microsoft Way<br />
        Redmond, WA 98052<br />
        <abbr title="Phone">P:</abbr>
        425.555.0100
    </address>
    
    <address>
        <strong>Support:</strong><email>Support</email><br />
        <strong>Marketing:</strong><email>Marketing</email>
    </address>
    
  2. Spusťte aplikaci a pomocí svého oblíbeného prohlížeče zobrazte zdroj HTML, abyste mohli ověřit, že jsou e-mailové značky nahrazeny značkou ukotvení (například <a>Support</a>). Podpora a marketing se vykreslují jako odkazy, ale nemají href atribut, aby byly funkční. Tento problém opravíme v další části.

SetAttribute a SetContent

V této části aktualizujeme, aby vytvořil platnou EmailTagHelper značku ukotvení pro e-mail. Aktualizujeme ho tak, aby převzal informace ze Razor zobrazení (ve formě mail-to atributu) a použili ho při generování ukotvení.

EmailTagHelper Aktualizujte třídu následujícím kódem:

public class EmailTagHelper : TagHelper
{
    private const string EmailDomain = "contoso.com";

    // Can be passed via <email mail-to="..." />. 
    // PascalCase gets translated into kebab-case.
    public string MailTo { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "a";    // Replaces <email> with <a> tag

        var address = MailTo + "@" + EmailDomain;
        output.Attributes.SetAttribute("href", "mailto:" + address);
        output.Content.SetContent(address);
    }
}
  • Názvy tříd a vlastností pascal-cased pro pomocné rutiny značek jsou přeloženy do jejich kebab case. Proto k použití atributu MailTo použijete <email mail-to="value"/> ekvivalent.

  • Poslední řádek nastaví dokončený obsah pro našeho pomocníka s minimální funkční značkou.

  • Zvýrazněný řádek zobrazuje syntaxi pro přidávání atributů:

public override void Process(TagHelperContext context, TagHelperOutput output)
{
    output.TagName = "a";    // Replaces <email> with <a> tag

    var address = MailTo + "@" + EmailDomain;
    output.Attributes.SetAttribute("href", "mailto:" + address);
    output.Content.SetContent(address);
}

Tento přístup funguje pro atribut "href", pokud v kolekci atributů aktuálně neexistuje. Metodu output.Attributes.Add můžete také použít k přidání pomocného atributu značky na konec kolekce atributů značek.

  1. Aktualizujte kód v Views/Home/Contact.cshtml souboru těmito změnami:

    @{
        ViewData["Title"] = "Contact Copy";
    }
    <h2>@ViewData["Title"].</h2>
    <h3>@ViewData["Message"]</h3>
    
    <address>
        One Microsoft Way Copy Version <br />
        Redmond, WA 98052-6399<br />
        <abbr title="Phone">P:</abbr>
        425.555.0100
    </address>
    
    <address>
        <strong>Support:</strong><email mail-to="Support"></email><br />
        <strong>Marketing:</strong><email mail-to="Marketing"></email>
    </address>
    
  2. Spusťte aplikaci a ověřte, že generuje správné odkazy.

Poznámka

Pokud byste chtěli napsat e-mailovou značku jako samozavírací (<email mail-to="Rick" />), konečný výstup by byl také samozavírací. Pokud chcete povolit možnost psát značku pouze se počáteční značkou (<email mail-to="Rick">), musíte třídu označit následujícím kódem:

[HtmlTargetElement("email", TagStructure = TagStructure.WithoutEndTag)] 
public class EmailVoidTagHelper : TagHelper
{
    private const string EmailDomain = "contoso.com";
    // Code removed for brevity

S pomocníkem samozavírací e-mailové značky by výstup byl <a href="mailto:Rick@contoso.com" />. Značky ukotvení samozavíracího kódu nejsou platné ve formátu HTML, takže byste ho nechtěli vytvořit, ale možná budete chtít vytvořit pomocnou rutinu značky, která se sama uzavře. Pomocné rutiny značek nastavují typ TagMode vlastnosti po přečtení značky.

Pomocí atributu můžete také mapovat jiný název atributu na [HtmlAttributeName] vlastnost.

Mapování atributu pojmenovaného recipient na MailTo vlastnost:

[HtmlAttributeName("recipient")]
public string? MailTo { get; set; }

Pomocná rutina značky recipient pro atribut:

<email recipient="…"/>

ProcessAsync

V této části napíšeme pomocníka pro asynchronní e-mail.

  1. EmailTagHelper Nahraďte třídu následujícím kódem:

    public class EmailTagHelper : TagHelper
    {
        private const string EmailDomain = "contoso.com";
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "a";                                 // Replaces <email> with <a> tag
            var content = await output.GetChildContentAsync();
            var target = content.GetContent() + "@" + EmailDomain;
            output.Attributes.SetAttribute("href", "mailto:" + target);
            output.Content.SetContent(target);
        }
    }
    

    Poznámky:

    • Tato verze používá asynchronní ProcessAsync metodu. Asynchronní GetChildContentAsync vrátí Task hodnotu obsahující TagHelperContenthodnotu .

    • Pomocí parametru output získáte obsah elementu HTML.

  2. Proveďte následující změnu Views/Home/Contact.cshtml souboru, aby pomocná rutina značky získala cílový e-mail.

    @{
        ViewData["Title"] = "Contact";
    }
    <h2>@ViewData["Title"].</h2>
    <h3>@ViewData["Message"]</h3>
    
    <address>
        One Microsoft Way<br />
        Redmond, WA 98052<br />
        <abbr title="Phone">P:</abbr>
        425.555.0100
    </address>
    
    <address>
        <strong>Support:</strong><email>Support</email><br />
        <strong>Marketing:</strong><email>Marketing</email>
    </address>
    
  3. Spusťte aplikaci a ověřte, že generuje platné e-mailové odkazy.

RemoveAll, PreContent.SetHtmlContent a PostContent.SetHtmlContent

  1. Do složky TagHelpers přidejte následující BoldTagHelper třídu.

    using Microsoft.AspNetCore.Razor.TagHelpers;
    
    namespace AuthoringTagHelpers.TagHelpers
    {
        [HtmlTargetElement(Attributes = "bold")]
        public class BoldTagHelper : TagHelper
        {
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                output.Attributes.RemoveAll("bold");
                output.PreContent.SetHtmlContent("<strong>");
                output.PostContent.SetHtmlContent("</strong>");
            }
        }
    }
    
    • Atribut [HtmlTargetElement] předá parametr atributu, který určuje, že se shodují všechny elementy HTML, které obsahují atribut HTML s názvem tučné písmo, a Process metoda override ve třídě se spustí. V naší ukázce Process metoda odebere atribut "bold" a obklopí obsahující kód s <strong></strong>.

    • Vzhledem k tomu, že nechcete nahradit stávající obsah značky, musíte zapsat počáteční <strong> značku metodou PreContent.SetHtmlContent a pravou </strong> značkou metodou PostContent.SetHtmlContent .

  2. About.cshtml Upravte zobrazení tak, aby obsahovalo hodnotu atributubold. Dokončený kód je uvedený níže.

    @{
        ViewData["Title"] = "About";
    }
    <h2>@ViewData["Title"].</h2>
    <h3>@ViewData["Message"]</h3>
    
    <p bold>Use this area to provide additional information.</p>
    
    <bold> Is this bold?</bold>
    
  3. Spustit aplikaci. Ke kontrole zdroje a ověření revize můžete použít svůj oblíbený prohlížeč.

    Výše [HtmlTargetElement] uvedený atribut cílí pouze na kód HTML, který poskytuje název atributu "bold". Pomocný <bold> prvek značky nezměnil.

  4. Zakomentujte řádek atributu [HtmlTargetElement] a ve výchozím nastavení bude cílit <bold> na značky, tj. HTML značky formuláře <bold>. Nezapomeňte, že výchozí konvence pojmenování bude odpovídat názvu třídy BoldTagHelper se <bold> značkami.

  5. Spusťte aplikaci a ověřte, že <bold> je značka zpracována pomocným pomocníkem značky.

Dekódování třídy s více [HtmlTargetElement] atributy má za následek logickou hodnotu OR cílů. Například pomocí následujícího kódu se bude shodovat tučná značka nebo tučný atribut.

[HtmlTargetElement("bold")]
[HtmlTargetElement(Attributes = "bold")]
public class BoldTagHelper : TagHelper
{
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.Attributes.RemoveAll("bold");
        output.PreContent.SetHtmlContent("<strong>");
        output.PostContent.SetHtmlContent("</strong>");
    }
}

Pokud se do stejného příkazu přidá více atributů, modul runtime je považuje za logický operátor AND. Například v následujícím kódu musí být element HTML pojmenován "bold" s atributem s názvem "bold" (<bold bold />), aby se shodoval.

[HtmlTargetElement("bold", Attributes = "bold")]

Můžete také použít [HtmlTargetElement] ke změně názvu cílového prvku. Pokud byste například chtěli BoldTagHelper cílové <MyBold> značky, použili byste následující atribut:

[HtmlTargetElement("MyBold")]

Předání modelu pomocné rutině značek

  1. Přidejte složku Models.

  2. Do složky Models přidejte následující WebsiteContext třídu:

    using System;
    
    namespace AuthoringTagHelpers.Models
    {
        public class WebsiteContext
        {
            public Version Version { get; set; }
            public int CopyrightYear { get; set; }
            public bool Approved { get; set; }
            public int TagsToShow { get; set; }
        }
    }
    
  3. Do složky TagHelpers přidejte následující WebsiteInformationTagHelper třídu.

    using System;
    using AuthoringTagHelpers.Models;
    using Microsoft.AspNetCore.Razor.TagHelpers;
    
    namespace AuthoringTagHelpers.TagHelpers
    {
        public class WebsiteInformationTagHelper : TagHelper
        {
            public WebsiteContext Info { get; set; }
    
          public override void Process(TagHelperContext context, TagHelperOutput output)
          {
             output.TagName = "section";
             output.Content.SetHtmlContent(
    $@"<ul><li><strong>Version:</strong> {Info.Version}</li>
    <li><strong>Copyright Year:</strong> {Info.CopyrightYear}</li>
    <li><strong>Approved:</strong> {Info.Approved}</li>
    <li><strong>Number of tags to show:</strong> {Info.TagsToShow}</li></ul>");
             output.TagMode = TagMode.StartTagAndEndTag;
          }
       }
    }
    
    • Jak už jsme zmínili dříve, pomocné rutiny značek překládají názvy a vlastnosti tříd jazyka C# s písmeny Pascal a vlastnosti pro pomocné rutiny značek do kebab case. Proto, chcete-li použít WebsiteInformationTagHelper in Razor, napíšete <website-information />.

    • Cílový prvek s atributem [HtmlTargetElement] explicitně neidentifikujete, takže výchozí hodnota website-information bude cílená. Pokud jste použili následující atribut (všimněte si, že se nejedná o případ kebabu, ale odpovídá názvu třídy):

    [HtmlTargetElement("WebsiteInformation")]
    

    Značka <website-information /> případu kebabu se neshoduje. Pokud chcete použít atribut, použili byste případ kebabu [HtmlTargetElement] , jak je znázorněno níže:

    [HtmlTargetElement("Website-Information")]
    
    • Prvky, které jsou samozavírací, nemají žádný obsah. V tomto příkladu Razor bude značka používat samozavírací značku, ale pomocná rutina značky vytvoří prvek oddílu(který není samozavírací a píšete obsah uvnitř elementusection). Proto je potřeba nastavit TagMode na StartTagAndEndTag zápis výstupu. Alternativně můžete zakomentovat nastavení TagMode řádku a psát značky pomocí uzavírací značky. (Příklad revize je k dispozici dále v tomto kurzu.)

    • Znak $ dolaru na následujícím řádku používá interpolovaný řetězec:

    $@"<ul><li><strong>Version:</strong> {Info.Version}</li>
    
  4. Do zobrazení přidejte následující kód About.cshtml . Zvýrazněný kód zobrazí informace o webu.

    @using AuthoringTagHelpers.Models
    @{
        ViewData["Title"] = "About";
        WebsiteContext webContext = new WebsiteContext {
                                        Version = new Version(1, 3),
                                        CopyrightYear = 1638,
                                        Approved = true,
                                        TagsToShow = 131 };
    }
    <h2>@ViewData["Title"].</h2>
    <h3>@ViewData["Message"]</h3>
    
    <p bold>Use this area to provide additional information.</p>
    
    <bold> Is this bold?</bold>
    
    <h3> web site info </h3>
    <website-information info="webContext" />
    

    Poznámka

    V níže Razor uvedeném kódu:

    <website-information info="webContext" />
    

    Razor ví, že info atribut je třída, nikoli řetězec a chcete napsat kód jazyka C#. Jakýkoli pomocný atribut značky bez řetězce by měl být zapsán bez znaku @ .

  5. Spusťte aplikaci a přejděte do zobrazení O aplikaci a zobrazte informace o webu.

    Poznámka

    Následující značky můžete použít se zavírací značkou a odebrat čáru TagMode.StartTagAndEndTag v pomocné rutině značky:

    <website-information info="webContext" >
    </website-information>
    

Pomocná rutina značky podmínky

Pomocná rutina značky podmínky vykreslí výstup při předání hodnoty true.

  1. Do složky TagHelpers přidejte následující ConditionTagHelper třídu.

    using Microsoft.AspNetCore.Razor.TagHelpers;
    
    namespace AuthoringTagHelpers.TagHelpers
    {
        [HtmlTargetElement(Attributes = nameof(Condition))]
        public class ConditionTagHelper : TagHelper
        {
            public bool Condition { get; set; }
    
            public override void Process(TagHelperContext context, TagHelperOutput output)
            {
                if (!Condition)
                {
                    output.SuppressOutput();
                }
            }
        }
    }
    
  2. Views/Home/Index.cshtml Obsah souboru nahraďte následujícím kódem:

    @using AuthoringTagHelpers.Models
    @model WebsiteContext
    
    @{
        ViewData["Title"] = "Home Page";
    }
    
    <div>
        <h3>Information about our website (outdated):</h3>
        <Website-InforMation info="Model" />
        <div condition="Model.Approved">
            <p>
                This website has <strong surround="em">@Model.Approved</strong> been approved yet.
                Visit www.contoso.com for more information.
            </p>
        </div>
    </div>
    
  3. Nahraďte metodu IndexHome v kontroleru následujícím kódem:

    public IActionResult Index(bool approved = false)
    {
        return View(new WebsiteContext
        {
            Approved = approved,
            CopyrightYear = 2015,
            Version = new Version(1, 3, 3, 7),
            TagsToShow = 20
        });
    }
    
  4. Spusťte aplikaci a přejděte na domovskou stránku. Kód v podmíněném div kódu se nevykreslí. Připojte řetězec ?approved=true dotazu k adrese URL (například http://localhost:1235/Home/Index?approved=true). approved je nastavena na hodnotu true a bude zobrazen podmíněný kód.

Poznámka

Pomocí operátoru nameof určete atribut, který se má cílit, místo abyste zadali řetězec, jako jste to udělali pomocí pomocné rutiny tučné značky:

[HtmlTargetElement(Attributes = nameof(Condition))]
 //   [HtmlTargetElement(Attributes = "condition")]
 public class ConditionTagHelper : TagHelper
{
   public bool Condition { get; set; }

   public override void Process(TagHelperContext context, TagHelperOutput output)
   {
      if (!Condition)
      {
         output.SuppressOutput();
      }
   }
}

Operátor nameof bude chránit kód, pokud by byl někdy refaktorován (můžeme chtít změnit název na RedCondition).

Vyhněte se konfliktům pomocných rutin značek

V této části napíšete dvojici pomocných rutin značek automatického propojení. První nahradí značky obsahující adresu URL začínající http na značku ukotvení HTML obsahující stejnou adresu URL (a tím získá odkaz na adresu URL). Druhý provede totéž pro adresu URL začínající na adrese WWW.

Vzhledem k tomu, že tyto dva pomocné rutiny úzce souvisejí a v budoucnu je můžete refaktorovat, budeme je uchovávat ve stejném souboru.

  1. Do složky TagHelpers přidejte následující AutoLinkerHttpTagHelper třídu.

    [HtmlTargetElement("p")]
    public class AutoLinkerHttpTagHelper : TagHelper
    {
        public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            var childContent = await output.GetChildContentAsync();
            // Find Urls in the content and replace them with their anchor tag equivalent.
            output.Content.SetHtmlContent(Regex.Replace(
                 childContent.GetContent(),
                 @"\b(?:https?://)(\S+)\b",
                  "<a target=\"_blank\" href=\"$0\">$0</a>"));  // http link version}
        }
    }
    

    Poznámka

    Třída AutoLinkerHttpTagHelper cílí p na elementy a používá Regex k vytvoření ukotvení.

  2. Na konec Views/Home/Contact.cshtml souboru přidejte následující kód:

    @{
        ViewData["Title"] = "Contact";
    }
    <h2>@ViewData["Title"].</h2>
    <h3>@ViewData["Message"]</h3>
    
    <address>
        One Microsoft Way<br />
        Redmond, WA 98052<br />
        <abbr title="Phone">P:</abbr>
        425.555.0100
    </address>
    
    <address>
        <strong>Support:</strong><email>Support</email><br />
        <strong>Marketing:</strong><email>Marketing</email>
    </address>
    
    <p>Visit us at http://docs.asp.net or at www.microsoft.com</p>
    
  3. Spusťte aplikaci a ověřte, že pomocná rutina značky vykresluje ukotvení správně.

  4. Aktualizujte třídu tak AutoLinker , aby zahrnovala AutoLinkerWwwTagHelper , která převede www text na značku ukotvení, která obsahuje také původní www text. Aktualizovaný kód je zvýrazněný níže:

        [HtmlTargetElement("p")]
        public class AutoLinkerHttpTagHelper : TagHelper
        {
            public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
            {
                var childContent = await output.GetChildContentAsync();
                // Find Urls in the content and replace them with their anchor tag equivalent.
                output.Content.SetHtmlContent(Regex.Replace(
                     childContent.GetContent(),
                     @"\b(?:https?://)(\S+)\b",
                      "<a target=\"_blank\" href=\"$0\">$0</a>"));  // http link version}
            }
        }
    
        [HtmlTargetElement("p")]
        public class AutoLinkerWwwTagHelper : TagHelper
        {
            public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
            {
                var childContent = await output.GetChildContentAsync();
                // Find Urls in the content and replace them with their anchor tag equivalent.
                output.Content.SetHtmlContent(Regex.Replace(
                    childContent.GetContent(),
                     @"\b(www\.)(\S+)\b",
                     "<a target=\"_blank\" href=\"http://$0\">$0</a>"));  // www version
            }
        }
    }
    
  5. Spustit aplikaci. Všimněte si, že se www text vykreslí jako odkaz, ale text HTTP není. Pokud do obou tříd umístíte zarážku, uvidíte, že pomocná třída značky HTTP se spouští jako první. Problém je, že pomocný výstup značky je uložen v mezipaměti a při spuštění pomocné rutiny značky WWW přepíše výstup z mezipaměti pomocníka značky HTTP. Později v tomto kurzu se dozvíme, jak řídit pořadí, ve které se používají pomocné rutiny značek. Kód opravíme následujícím kódem:

      public class AutoLinkerHttpTagHelper : TagHelper
      {
          public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
          {
              var childContent = output.Content.IsModified ? output.Content.GetContent() :
                  (await output.GetChildContentAsync()).GetContent();
    
              // Find Urls in the content and replace them with their anchor tag equivalent.
              output.Content.SetHtmlContent(Regex.Replace(
                   childContent,
                   @"\b(?:https?://)(\S+)\b",
                    "<a target=\"_blank\" href=\"$0\">$0</a>"));  // http link version}
          }
      }
    
      [HtmlTargetElement("p")]
      public class AutoLinkerWwwTagHelper : TagHelper
      {
          public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
          {
              var childContent = output.Content.IsModified ? output.Content.GetContent() : 
                  (await output.GetChildContentAsync()).GetContent();
    
              // Find Urls in the content and replace them with their anchor tag equivalent.
              output.Content.SetHtmlContent(Regex.Replace(
                   childContent,
                   @"\b(www\.)(\S+)\b",
                   "<a target=\"_blank\" href=\"http://$0\">$0</a>"));  // www version
          }
      }
    

    Poznámka

    V první edici pomocných rutin značek automatického propojení jste získali obsah cíle s následujícím kódem:

    var childContent = await output.GetChildContentAsync();
    

    To znamená, že voláte GetChildContentAsync metodu předanou TagHelperOutput metodou ProcessAsync . Jak už bylo zmíněno dříve, protože výstup je uložen v mezipaměti, poslední pomocná rutina značky ke spuštění wins. Tento problém jste opravili pomocí následujícího kódu:

    var childContent = output.Content.IsModified ? output.Content.GetContent() : 
        (await output.GetChildContentAsync()).GetContent();
    

    Výše uvedený kód zkontroluje, jestli byl obsah změněn a jestli obsahuje, získá obsah z výstupní vyrovnávací paměti.

  6. Spusťte aplikaci a ověřte, že oba odkazy fungují podle očekávání. I když se může zobrazit, že pomocná rutina značky automatického linkeru je správná a dokončená, má malý problém. Pokud se pomocné rutiny značek WWW spustí jako první, odkazy www nebudou správné. Aktualizujte kód přidáním Order přetížení, abyste mohli řídit pořadí, ve kterém se značka spouští. Vlastnost Order určuje pořadí provádění vzhledem k ostatním pomocným rutinm značek, které cílí na stejný prvek. Výchozí hodnota pořadí je nula a nejprve se spustí instance s nižšími hodnotami.

    public class AutoLinkerHttpTagHelper : TagHelper
    {
        // This filter must run before the AutoLinkerWwwTagHelper as it searches and replaces http and 
        // the AutoLinkerWwwTagHelper adds http to the markup.
        public override int Order
        {
            get  {  return int.MinValue;   }
        }
    

    Předchozí kód zaručuje, že pomocná rutina značky HTTP běží před pomocným rutinou značky WWW. MaxValue Změňte Order a ověřte, že kód vygenerovaný pro značku WWW je nesprávný.

Kontrola a načtení podřízeného obsahu

Pomocné rutiny značek poskytují několik vlastností pro načtení obsahu.

  • Výsledek GetChildContentAsync může být připojen k output.Content.
  • Výsledek GetChildContentAsync můžete zkontrolovat pomocí GetContentfunkce .
  • Pokud upravíte output.Content, text TagHelperu se nespustí ani nevykreslí, pokud nevoláte GetChildContentAsync jako v naší ukázce automatického linkeru:
public class AutoLinkerHttpTagHelper : TagHelper
{
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        var childContent = output.Content.IsModified ? output.Content.GetContent() :
            (await output.GetChildContentAsync()).GetContent();

        // Find Urls in the content and replace them with their anchor tag equivalent.
        output.Content.SetHtmlContent(Regex.Replace(
             childContent,
             @"\b(?:https?://)(\S+)\b",
              "<a target=\"_blank\" href=\"$0\">$0</a>"));  // http link version}
    }
}
  • Více volání, která GetChildContentAsync vrátí stejnou hodnotu a nespustí TagHelper tělo znovu, pokud nepředáte nepravdivý parametr označující, že nebudete používat výsledek v mezipaměti.

Načtení minifikovaného částečného zobrazení TagHelper

V produkčních prostředích lze výkon zlepšit načtením minifikovaných částečných zobrazení. Využití minifikovaného částečného zobrazení v produkčním prostředí:

  • Vytvořte nebo nastavte předpřipravený proces, který minifies částečné zobrazení.
  • Následující kód použijte k načtení minifikovaných částečných zobrazení v prostředích, která nejsou vývojová.
public class MinifiedVersionPartialTagHelper : PartialTagHelper
    {
        public MinifiedVersionPartialTagHelper(ICompositeViewEngine viewEngine, 
                                IViewBufferScope viewBufferScope)
                               : base(viewEngine, viewBufferScope)
        {

        }

        public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
        {
            // Append ".min" to load the minified partial view.
            if (!IsDevelopment())
            {
                Name += ".min";
            }

            return base.ProcessAsync(context, output);
        }

        private bool IsDevelopment()
        {
            return Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") 
                                                 == EnvironmentName.Development;
        }
    }