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 TagHelper
nich , tím získáte přístup k Process
metodě.
Vytvořte nový projekt ASP.NET Core s názvem AuthoringTagHelpers. Pro tento projekt nebudete potřebovat ověřování.
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.
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 zTagHelper
. TřídaTagHelper
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řídaTagHelper
také poskytuje asynchronní verzi (ProcessAsync
) se stejnými parametry.Kontextový parametr (
Process
aProcessAsync
) obsahuje informace spojené se spuštěním aktuální značky HTML.Výstupní parametr pro
Process
(aProcessAsync
) 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
Pokud chcete třídu zpřístupnit
EmailTagHelper
všem našim Razor zobrazením, přidejte do souboru direktivuaddTagHelper
Views/_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ů.
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>
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.
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>
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.
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íTagHelperContent
hodnotu .Pomocí parametru
output
získáte obsah elementu HTML.
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>
Spusťte aplikaci a ověřte, že generuje platné e-mailové odkazy.
RemoveAll, PreContent.SetHtmlContent a PostContent.SetHtmlContent
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, aProcess
metoda override ve třídě se spustí. V naší ukázceProcess
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 metodouPreContent.SetHtmlContent
a pravou</strong>
značkou metodouPostContent.SetHtmlContent
.
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>
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.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.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
Přidejte složku Models.
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; } } }
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í hodnotawebsite-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ř elementu
section
). Proto je potřeba nastavitTagMode
naStartTagAndEndTag
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>
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@
.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.
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(); } } } }
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>
Nahraďte metodu
Index
Home
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 }); }
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říkladhttp://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.
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í.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>
Spusťte aplikaci a ověřte, že pomocná rutina značky vykresluje ukotvení správně.
Aktualizujte třídu tak
AutoLinker
, aby zahrnovalaAutoLinkerWwwTagHelper
, 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 } } }
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ředanouTagHelperOutput
metodouProcessAsync
. 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.
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í. VlastnostOrder
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ěňteOrder
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 koutput.Content
. - Výsledek
GetChildContentAsync
můžete zkontrolovat pomocíGetContent
funkce . - Pokud upravíte
output.Content
, text TagHelperu se nespustí ani nevykreslí, pokud nevoláteGetChildContentAsync
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;
}
}
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro