ASP.NET Core'da Etiket Yardımcıları Yazma
Gönderen Rick Anderson
Örnek kodu görüntüleme veya indirme (indirme)
Etiket Yardımcılarını kullanmaya başlama
Bu öğretici, Etiket Yardımcılarını programlamaya giriş sağlar. Etiket Yardımcılarına Giriş, Etiket Yardımcılarının sağladığı avantajları açıklar.
Etiket yardımcısı, arabirimini uygulayan ITagHelper
herhangi bir sınıftır. Ancak, bir etiket yardımcısı yazdığınızda, genellikle 'den TagHelper
türetilirsiniz. Bunu yaptığınızda yöntemine Process
erişim elde edebilirsiniz.
AuthoringTagHelpers adlı yeni bir ASP.NET Core projesi oluşturun. Bu proje için kimlik doğrulamasına ihtiyacınız olmayacak.
TagHelpers adlı Etiket Yardımcılarını tutmak için bir klasör oluşturun. TagHelpers klasörü gerekli değildir, ancak makul bir kuraldır. Şimdi bazı basit etiket yardımcıları yazmaya başlayalım.
En düşük Etiket Yardımcısı
Bu bölümde, e-posta etiketini güncelleştiren bir etiket yardımcısı yazacaksınız. Örnek:
<email>Support</email>
Sunucu, bu işaretlemeyi aşağıdakine dönüştürmek için e-posta etiketi yardımcımızı kullanır:
<a href="mailto:Support@contoso.com">Support@contoso.com</a>
Yani, bunu e-posta bağlantısı yapan bir yer işareti. Bir blog altyapısı yazıyorsanız ve pazarlama, destek ve diğer kişiler için aynı etki alanına e-posta göndermesi gerekiyorsa bunu yapmak isteyebilirsiniz.
Aşağıdaki
EmailTagHelper
sınıfı TagHelpers klasörüne ekleyin.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 } } }
Etiket yardımcıları, kök sınıf adının öğelerini hedefleyen bir adlandırma kuralı kullanır (sınıf adının TagHelper bölümü hariç). Bu örnekte EmailTagHelper'ın kök adı e-posta
<email>
olduğundan etiket hedeflenir. Bu adlandırma kuralı çoğu etiket yardımcısında işe yarar, daha sonra bunu nasıl geçersiz kılacağım göstereceğiz.EmailTagHelper
sınıfı öğesindenTagHelper
türetilir. sınıfı,TagHelper
Etiket Yardımcıları yazmak için yöntemler ve özellikler sağlar.Geçersiz kılınan
Process
yöntem, etiket yardımcısının yürütürken ne yaptığını denetler. sınıfıTagHelper
da aynı parametrelere sahip zaman uyumsuz bir sürüm (ProcessAsync
) sağlar.bağlam parametresi
Process
(veProcessAsync
) geçerli HTML etiketinin yürütülmesiyle ilişkili bilgileri içerir.(ve
ProcessAsync
) çıkış parametresiProcess
, HTML etiketi ve içeriği oluşturmak için kullanılan özgün kaynağın durum bilgisi olan bir HTML öğesi temsilcisini içerir.Sınıf adımızın TagHelper soneki vardır ve bu gerekli değildir, ancak en iyi yöntem kuralı olarak kabul edilir. Sınıfı şu şekilde bildirebilirsiniz:
public class Email : TagHelper
Sınıfı tüm
EmailTagHelper
görünümlerimizin Razor kullanımına açmak için dosyasınınaddTagHelper
yönergesiniViews/_ViewImports.cshtml
ekleyin:@using AuthoringTagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, AuthoringTagHelpers
Yukarıdaki kod, derlememizdeki tüm etiket yardımcılarının kullanılabilir olacağını belirtmek için joker karakter söz dizimini kullanır. Sonraki ilk dize
@addTagHelper
yüklenecek etiket yardımcısını belirtir (Tüm etiket yardımcıları için "*" kullanın) ve ikinci dize "AuthoringTagHelpers", etiket yardımcısının içinde olduğu derlemeyi belirtir. Ayrıca, ikinci satırın joker karakter söz dizimini kullanarak ASP.NET Core MVC etiketi yardımcılarını getirdiğine de dikkat edin (bu yardımcılar Etiket Yardımcılarına Giriş bölümünde açıklandı.) Etiket yardımcısını@addTagHelper
görünümde kullanılabilir hale getiren yönergedirRazor. Alternatif olarak, aşağıda gösterildiği gibi bir etiket yardımcısının tam adını (FQN) sağlayabilirsiniz:
@using AuthoringTagHelpers
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper AuthoringTagHelpers.TagHelpers.EmailTagHelper, AuthoringTagHelpers
FQN kullanarak bir görünüme etiket yardımcısı eklemek için önce FQN ' yi ()AuthoringTagHelpers.TagHelpers.EmailTagHelper
ve ardından derleme adını (AuthoringTagHelpers, olması gerekmez namespace
) eklersiniz. Çoğu geliştirici joker karakter söz dizimini kullanmayı tercih eder. Etiket Yardımcıları'na giriş, etiket yardımcısı ekleme, kaldırma, hiyerarşi ve joker karakter söz dizimi hakkında ayrıntılı bilgi alır.
Dosyadaki işaretlemeyi şu değişikliklerle güncelleştirin
Views/Home/Contact.cshtml
:@{ 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>
Uygulamayı çalıştırın ve e-posta etiketlerinin yer işaretiyle değiştirildiğini doğrulayabilmeniz için HTML kaynağını görüntülemek için sık kullandığınız tarayıcıyı kullanın (örneğin,
<a>Support</a>
). Destek ve Pazarlama bir bağlantı olarak işlenir, ancak bunları işlevsel hale getirmek için birhref
özniteliği yoktur. Bunu sonraki bölümde düzelteceğiz.
SetAttribute ve SetContent
Bu bölümde, e-posta için geçerli bir yer işareti oluşturacak şekilde öğesini EmailTagHelper
güncelleştireceğiz. Bunu bir görünümden Razor (öznitelik biçiminde mail-to
) bilgi alacak ve tutturucuyu oluştururken kullanacak şekilde güncelleştireceğiz.
sınıfını EmailTagHelper
aşağıdakilerle güncelleştirin:
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);
}
}
Etiket yardımcıları için Pascal cased sınıfı ve özellik adları kebap olayına çevrilir. Bu nedenle, özniteliğini
MailTo
kullanmak için eşdeğerini kullanacaksınız<email mail-to="value"/>
.Son satır, en düşük düzeyde işlevsel etiket yardımcımız için tamamlanmış içeriği ayarlar.
Vurgulanan satır öznitelik ekleme söz dizimini gösterir:
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);
}
Bu yaklaşım, öznitelikler koleksiyonunda mevcut olmadığı sürece "href" özniteliği için çalışır. Etiket öznitelikleri koleksiyonunun output.Attributes.Add
sonuna bir etiket yardımcısı özniteliği eklemek için yöntemini de kullanabilirsiniz.
Dosyadaki işaretlemeyi şu değişikliklerle güncelleştirin
Views/Home/Contact.cshtml
:@{ 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>
Uygulamayı çalıştırın ve doğru bağlantıları oluşturduğunu doğrulayın.
Dekont
E-posta etiketini kendi kendine kapatma ()<email mail-to="Rick" />
yazarsanız son çıkış da kendi kendine kapanıyor olur. Etiketi yalnızca başlangıç etiketiyle (<email mail-to="Rick">
) yazabilme özelliğini etkinleştirmek için sınıfı aşağıdakilerle işaretlemeniz gerekir:
[HtmlTargetElement("email", TagStructure = TagStructure.WithoutEndTag)]
public class EmailVoidTagHelper : TagHelper
{
private const string EmailDomain = "contoso.com";
// Code removed for brevity
Kendi kendini kapatan bir e-posta etiketi yardımcısı ile çıkış olacaktır <a href="mailto:Rick@contoso.com" />
. Kendi kendine kapanan yer işareti etiketleri geçerli HTML değildir, bu nedenle bir tane oluşturmak istemezsiniz, ancak kendi kendine kapanan bir etiket yardımcısı oluşturmak isteyebilirsiniz. Etiket yardımcıları, bir etiketi okuduktan sonra özelliğin TagMode
türünü ayarlar.
Ayrıca özniteliğini kullanarak [HtmlAttributeName]
farklı bir öznitelik adını bir özelliğe eşleyebilirsiniz.
adlı recipient
özniteliği özelliğiyle eşlemek MailTo
için:
[HtmlAttributeName("recipient")]
public string? MailTo { get; set; }
Özniteliği için recipient
Etiket Yardımcısı:
<email recipient="…"/>
ProcessAsync
Bu bölümde, zaman uyumsuz bir e-posta yardımcısı yazacağız.
sınıfını
EmailTagHelper
aşağıdaki kodla değiştirin: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); } }
Notlar:
Bu sürüm zaman uyumsuz
ProcessAsync
yöntemini kullanır. Zaman uyumsuzGetChildContentAsync
, öğesini içerenTagHelperContent
birTask
döndürür.HTML öğesinin
output
içeriğini almak için parametresini kullanın.
Etiket yardımcısının hedef e-postayı
Views/Home/Contact.cshtml
alabilmesi için dosyada aşağıdaki değişikliği yapın.@{ 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>
Uygulamayı çalıştırın ve geçerli e-posta bağlantıları oluşturduğunu doğrulayın.
RemoveAll, PreContent.SetHtmlContent ve PostContent.SetHtmlContent
Aşağıdaki
BoldTagHelper
sınıfı TagHelpers klasörüne ekleyin.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>"); } } }
özniteliği,
[HtmlTargetElement]
"bold" adlı bir HTML özniteliği içeren herhangi bir HTML öğesinin eşleşeceğini belirten bir öznitelik parametresi geçirir ve sınıftakiProcess
geçersiz kılma yöntemi çalıştırılır. Örneğimizde yöntemi "Process
bold" özniteliğini kaldırır ve içeren işaretlemeyi ile<strong></strong>
çevreler.Mevcut etiket içeriğini değiştirmek istemediğinizden, açma
<strong>
etiketini yöntemiylePreContent.SetHtmlContent
ve kapanış</strong>
etiketini yöntemiylePostContent.SetHtmlContent
yazmanız gerekir.
About.cshtml
Görünümü bir öznitelik değeri içerecek şekildebold
değiştirin. Tamamlanmış kod aşağıda gösterilmiştir.@{ 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>
Uygulamayı çalıştırma. Kaynağı incelemek ve işaretlemeyi doğrulamak için sık kullandığınız tarayıcıyı kullanabilirsiniz.
Yukarıdaki
[HtmlTargetElement]
öznitelik yalnızca "bold" öznitelik adı sağlayan HTML işaretlemesini hedefler.<bold>
öğesi etiket yardımcısı tarafından değiştirilmedi.Öznitelik satırını açıklama satırına
[HtmlTargetElement]
açıklama ekler ve varsayılan olarak formun<bold>
HTML işaretlemesi olan hedefleme etiketlerine<bold>
ayarlanır. Varsayılan adlandırma kuralının BoldTagHelper<bold>
sınıf adıyla etiketlerle eşleşeceğini unutmayın.Uygulamayı çalıştırın ve etiketin
<bold>
etiket yardımcısı tarafından işlendiğini doğrulayın.
Bir sınıfı birden çok [HtmlTargetElement]
öznitelikle süslemek, hedeflerin mantıksal VEYA ile sonuçlanıyor. Örneğin, aşağıdaki kodu kullanarak kalın bir etiket veya kalın bir öznitelik eşleşecektir.
[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>");
}
}
Aynı deyime birden çok öznitelik eklendiğinde, çalışma zamanı bunları mantıksal and olarak ele alır. Örneğin, aşağıdaki kodda, bir HTML öğesinin eşleşmesi için "bold" (<bold bold />
) adlı bir öznitelikle "bold" olarak adlandırılması gerekir.
[HtmlTargetElement("bold", Attributes = "bold")]
Hedeflenen öğenin adını değiştirmek için de kullanabilirsiniz [HtmlTargetElement]
. Örneğin BoldTagHelper
, hedef etiketleri istiyorsanız <MyBold>
aşağıdaki özniteliği kullanabilirsiniz:
[HtmlTargetElement("MyBold")]
Modeli Etiket Yardımcısı'na geçirme
Models klasörü ekleyin.
Models klasörüne aşağıdaki
WebsiteContext
sınıfı ekleyin: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; } } }
Aşağıdaki
WebsiteInformationTagHelper
sınıfı TagHelpers klasörüne ekleyin.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; } } }
Daha önce belirtildiği gibi etiket yardımcıları, etiket yardımcıları için Pascal büyük/küçük harfli C# sınıf adlarını ve özelliklerini kebap olayına çevirir. Bu nedenle, içinde Razorkullanmak
WebsiteInformationTagHelper
için yazın<website-information />
.Hedef öğeyi özniteliğiyle
[HtmlTargetElement]
açıkça tanımlamadığınız için varsayılanwebsite-information
öğesi hedeflenir. Aşağıdaki özniteliği uyguladıysanız (kebap örneği olmadığını ancak sınıf adıyla eşleşdiğini unutmayın):
[HtmlTargetElement("WebsiteInformation")]
Kebap olayı etiketi
<website-information />
eşleşmiyor. özniteliğini[HtmlTargetElement]
kullanmak istiyorsanız, aşağıda gösterildiği gibi kebap büyük/küçük harf kullanabilirsiniz:[HtmlTargetElement("Website-Information")]
Kendi kendine kapanan öğelerin içeriği yoktur. Bu örnekte, Razor işaretleme kendi kendine kapanan bir etiket kullanır, ancak etiket yardımcısı bir bölüm öğesi oluşturur (kendi kendini kapatmaz ve öğenin içine
section
içerik yazarsınız). Bu nedenle, çıkış yazmak içinStartTagAndEndTag
olarak ayarlamanızTagMode
gerekir. Alternatif olarak, satır ayarınıTagMode
açıklama satırı yapabilir ve kapanış etiketiyle işaretleme yazabilirsiniz. (Örnek işaretleme bu öğreticinin ilerleyen bölümlerinde sağlanmıştır.)$
Aşağıdaki satırdaki (dolar işareti) ilişkilendirilmiş bir dize kullanır:
$@"<ul><li><strong>Version:</strong> {Info.Version}</li>
Görünüme aşağıdaki işaretlemeyi
About.cshtml
ekleyin. Vurgulanan işaretleme, web sitesi bilgilerini görüntüler.@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" />
Dekont
Aşağıda gösterilen işaretlemede Razor :
<website-information info="webContext" />
Razor özniteliğinin
info
dize değil sınıf olduğunu bilir ve C# kodu yazmak istiyorsunuz. Dize olmayan herhangi bir etiket yardımcısı özniteliği, karakter olmadan@
yazılmalıdır.Uygulamayı çalıştırın ve web sitesi bilgilerini görmek için Hakkında görünümüne gidin.
Dekont
Aşağıdaki işaretlemeyi bir kapanış etiketiyle kullanabilir ve etiket yardımcısında ile
TagMode.StartTagAndEndTag
satırını kaldırabilirsiniz:<website-information info="webContext" > </website-information>
Koşul Etiketi Yardımcısı
Koşul etiketi yardımcısı, doğru bir değer geçirildiğinde çıkışı işler.
Aşağıdaki
ConditionTagHelper
sınıfı TagHelpers klasörüne ekleyin.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(); } } } }
Dosyanın içeriğini
Views/Home/Index.cshtml
aşağıdaki işaretlemeyle değiştirin:@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>
denetleyicideki
Index
Home
yöntemini aşağıdaki kodla değiştirin:public IActionResult Index(bool approved = false) { return View(new WebsiteContext { Approved = approved, CopyrightYear = 2015, Version = new Version(1, 3, 3, 7), TagsToShow = 20 }); }
Uygulamayı çalıştırın ve giriş sayfasına gidin. Koşulludaki
div
işaretleme işlenmez. Sorgu dizesini?approved=true
URL'ye ekleyin (örneğin,http://localhost:1235/Home/Index?approved=true
).approved
true olarak ayarlanır ve koşullu işaretleme görüntülenir.
Dekont
Kalın etiket yardımcısıyla yaptığınız gibi bir dize belirtmek yerine hedef özniteliğini belirtmek için nameof işlecini kullanın:
[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();
}
}
}
Yeniden düzenlenmesi durumunda nameof işleci kodu korur (adı RedCondition
olarak değiştirmek isteyebiliriz).
Etiket Yardımcısı çakışmalarını önleme
Bu bölümde, bir çift otomatik bağlama etiketi yardımcısı yazacaksınız. İlki, HTTP ile başlayan bir URL içeren işaretlemeyi aynı URL'yi içeren bir HTML bağlantısı etiketine (ve dolayısıyla URL'ye bir bağlantı oluşturan) değiştirir. İkincisi, WWW ile başlayan bir URL için de aynı işlemi yapar.
Bu iki yardımcı birbiriyle yakından ilişkili olduğundan ve gelecekte bunları yeniden düzenleyebileceği için, bunları aynı dosyada tutacağız.
Aşağıdaki
AutoLinkerHttpTagHelper
sınıfı TagHelpers klasörüne ekleyin.[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} } }
Dekont
AutoLinkerHttpTagHelper
sınıfı öğeleri hedeflerp
ve bağlantı oluşturmak için Regex kullanır.Dosyanın sonuna aşağıdaki işaretlemeyi
Views/Home/Contact.cshtml
ekleyin:@{ 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>
Uygulamayı çalıştırın ve etiket yardımcısının tutturucuyu doğru şekilde işleyip işlemediğini doğrulayın.
sınıfını
AutoLinker
AutoLinkerWwwTagHelper
, www metnini özgün www metnini de içeren bir tutturucu etiketine dönüştürecek şekilde güncelleştirin. Güncelleştirilmiş kod aşağıda vurgulanır:[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 } } }
Uygulamayı çalıştırma. Www metninin bağlantı olarak işlendiğine ancak HTTP metninin işlenmediğine dikkat edin. Her iki sınıfa da kesme noktası koyarsanız, önce HTTP etiketi yardımcı sınıfının çalıştığını görebilirsiniz. Sorun, etiket yardımcı çıkışının önbelleğe alınmış olması ve WWW etiket yardımcısı çalıştırıldığında HTTP etiketi yardımcısından önbelleğe alınan çıkışın üzerine yazmasıdır. Öğreticinin ilerleyen bölümlerinde, yardımcıları etiketlemenin çalıştığı sırayı nasıl denetleyebileceğimizi göreceğiz. Kodu aşağıdakilerle düzelteceğiz:
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 } }
Dekont
Otomatik bağlama etiketi yardımcılarının ilk sürümünde, hedefin içeriğini aşağıdaki kodla aldınız:
var childContent = await output.GetChildContentAsync();
Yani, yöntemine
ProcessAsync
geçirilen kullanarakTagHelperOutput
çağırırsınızGetChildContentAsync
. Daha önce belirtildiği gibi, çıktı önbelleğe alındığından, çalıştırılacak son etiket yardımcısı kazanır. Bu sorunu aşağıdaki kodla düzelttiniz:var childContent = output.Content.IsModified ? output.Content.GetContent() : (await output.GetChildContentAsync()).GetContent();
Yukarıdaki kod, içeriğin değiştirilip değiştirilmediğini denetler ve değiştirilip değiştirilmediğini denetler ve içeriği çıkış arabelleğinden alır.
Uygulamayı çalıştırın ve iki bağlantının beklendiği gibi çalıştığını doğrulayın. Otomatik bağlayıcı etiket yardımcımız doğru ve eksiksiz görünse de, küçük bir sorunu vardır. önce WWW etiketi yardımcısı çalıştırılırsa, www bağlantıları doğru olmaz. Etiketin çalıştığı sırayı
Order
denetlemek için aşırı yüklemeyi ekleyerek kodu güncelleştirin. özelliği,Order
aynı öğeyi hedefleyen diğer etiket yardımcılarına göre yürütme sırasını belirler. Varsayılan sipariş değeri sıfırdır ve önce daha düşük değerlere sahip örnekler yürütülür.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; } }
Yukarıdaki kod, HTTP etiketi yardımcısının WWW etiketi yardımcıdan önce çalışmasını garanti eder.
MaxValue
olarak değiştirinOrder
ve WWW etiketi için oluşturulan işaretlemenin yanlış olduğunu doğrulayın.
Alt içeriği inceleme ve alma
Etiket yardımcıları içerik almak için çeşitli özellikler sağlar.
- sonucu
GetChildContentAsync
sonunaoutput.Content
eklenebilir. - ile
GetContent
sonucunuGetChildContentAsync
inceleyebilirsiniz. - öğesini değiştirirseniz
output.Content
, otomatik bağlayıcı örneğimizde olduğu gibi çağırmadığınızGetChildContentAsync
sürece TagHelper gövdesi yürütülemez veya işlenmez:
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}
}
}
- birden çok çağrısı
GetChildContentAsync
aynı değeri döndürür ve önbelleğe alınan sonucu kullanmayabileceğinizi belirten bir false parametresi geçirmediğiniz sürece gövdeyi yeniden yürütmezTagHelper
.
Yük küçültüldü kısmi görünüm TagHelper
Üretim ortamlarında, küçültüldü kısmi görünümler yüklenerek performans artırılabilir. Üretimde küçültüldü kısmi görünümden yararlanmak için:
- Kısmi görünümleri en aza indiren bir derleme öncesi işlemi oluşturun/ayarlayın.
- Geliştirme dışı ortamlarda küçültüldü kısmi görünümleri yüklemek için aşağıdaki kodu kullanın.
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;
}
}
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin