ASP.NET MVC'de Özel Tag Yardıma Giriş

Modern web uygulamaları temiz, kullanılabilir ve yeniden kullanılabilir bir görünüm kodu talep eder. ASP.NET Core MVC, kod yardımcılarını doğrudan Razor görüşlerinde dönüştürmeye ve HTML işaretleyicilerini oluşturmaya yardımcı olur.Putsal olmayan kodlama yardımcıları ile çerçeveli gemiler oluşturmakta, doğrulama, caching ve çevreye özgü, gerçek dünya projeleri genellikle, her iki ekspres alanı içeren özel mantık ve sunum kalıpları gerektirir.Özel etiketleme yardımcıları oluşturmak için sağlar.

Karmaşık HTML nesli ve koşullu mantık yeniden kullanılabilir etiket yardımcı sınıfları ile ilgili farklı sunum endişeleriniz, test edilebilirliği geliştirmek ve büyük kod tabanlarında çoğaltmayı azaltmak için kapsamlı bir kılavuz sunar.Bu makale, bu tekniği günlük gelişiminize entegre etmenize yardımcı olmak için kapsamlı bir kılavuz sunar.

Tag Yardımcıları ASP.NET Core'te Anlamak

Tag yardımcıları, HTML elementlerinin Razor görüşlerinde uygulanmasına katılan sunucu-side bileşenlerdir. C# kodunu belirli HTML elementlerine veya özel element isimlerine ekleyebilmenizi sağlar, istemciye gönderilmeden önce işaret eder.

Örneğin, yerleşik einENFLT:1), etiketi yardımcı cihazı doğru URL'ye kontrol ve eylem özelliklerini birleştirir. Tag yardımcılar tüm elementleri değiştirebilir, CSS sınıflarını ekleyin ve hatta ek HTML'yi enjekte ederler. Razor view execution pipeline sırasında çalışır ve mevcut istek içeriğine tam erişim sağlar, model verileri ve kayıtlı hizmetler.

ServerSide Execution Model

Razor görüşü derlendiği zaman, bir maç bulunamadı ve DAHA FAZLA:2) yönergeler. çerçeve, kayıtlı tüm etiketleme yardımcılarına karşı her HTML elementini değerlendirir, onların [[Döneticileri 3) veya [[Döneticileri tarafından keşfedildi.Bu, son HTML çıktısı oluşturulmadan önce gerçekleşir, etiketleme yardımcılarının öğelerini zenginleştirmelerine veya değiştirmelerine izin verir.

Diğer View Piano Tools'dan Anahtar Farklılıklar

  • [FONT:0)HTML Yardımcılar: [Döneticileri:[Döneticileri) C# yöntemi Razor bloklarında ([[Dönemli) aramaları gerekir, bu da HTML merkezli akışı kırabilir.
  • [FONT:0]Partials:[[Döneticiler:[Döneticiler:[Döneticiler:[Döneticiler:[Döneticiler:[Dönemliler: 0) Sabit işaretlenmeler için iyi, ancak sunucu-önemli mantıka dayalı olarak, başka bir bakış modelleri olmadan programlanabilir.
  • [FONT:0)View Bileşenler:[[Dönetici: 0 3) Karmaşık, veri odaklı widgets kendi mantığı ve sunumu ile, ancak ayrı bir sınıf ve sözelasyon sözcülüğü gerektirir ([DDDDDDDDDDDDDDDDDDDDDD) Tag yardımcıları, element odaklı dönüşümler için daha basit.

Neden Özel Tag Yardımcıları Oluşturun?

Oluşturulan etiket yardımcıları birçok ortak senaryoyu kaplarken, özel etiket yardımcıları doğrudan kod kalitesini ve geliştirici verimliliğini artırmak için eşsiz avantajlar sağlar.

  • [FONT:0)Encapsulate Kompleks Markup Desenleri[[Dönetici:0) Tekrarlama kompont HTML (yapılı kart bileşenleri, veri masaları veya stil düğmeleri gibi) tek bir özel öğeye kapılabilir. Değişiklikler bir sınıf güncellemek suretiyle tüm uygulama boyunca.
  • [FONT=0)Enforce Design Consistency[[Dönetici: 1 ) – A customENFLT:7) veya [[FONTD:0) etiketi yardımcı cihazı tutarlı CSS sınıflarını, erişilebilirliği özelliklerini ve veri toplama kalıpları, UI inconsistity şanslarını azaltabilir.
  • [FONT=0)Improve View Readability [Dönetici: 1 ) – NestedENFLT:9) ve koşullu C# bloklar yerine, birkaç özellik ile tek bir etiket tarama ve koruma için çok daha kolaydır.
  • [FONT=0)Enable Unit Test of View Logic) – Çünkü etiket yardımcıları HTML üreten sınıflardır, çeşitli girişler için üretilen çıktıları doğrulamak için bir birim testleri yazabilirsiniz, Razor kodu ile elde etmek zor bir şey.
  • [FONT:0)Increase Reusability Across Projects) – Özel etiket yardımcılarının bir kütüphanesi NuGet bileşeni olarak paketlenebilir ve birçok çözümle paylaşılabilir, tutarlı bir UI aracı geliştirmeyi destekler.

Temel bir Özel Tag Yardımcı Yaratmak

Her özel etiket yardımcı sınıfı (veya doğrudan) ve HTML elementinin veya özelliklerini belirtilmesi için dekore edilmiştir.The core of the logic life inside.The core of the logic life inside thesynchronous mevkiiruring::14).

Adım 1: Tag Yardım Sınıfını Tanımlayın

Projenizde yeni bir C# sınıfı oluşturun, genellikle bir [[DüzD: 16) klasörün içinde.Inherit from 03.05.2012 ve görüşlerinizde kullanmak istediğiniz element adı ile ilgili olarak [[Geçmişler.

[HtmlTargetElement("custom-card")]
public class CustomCardTagHelper : TagHelper
{
 public string Title { get; set; }
 public string CssClass { get; set; } = "card-default";

 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
 // Replace the custom tag with a div and add the desired structure
 output.TagName = "div";
 output.Attributes.SetAttribute("class", $"card {CssClass}");

 // Build inner content
 output.Content.SetHtmlContent(
 $@"<div class=""card-header"">{Title}</div>
 <div class=""card-body"">
 {output.Content.GetContent()}
 </div>"
 );
 }
}

2. Adım: Tag HelperContext ve Tag HelperOutput

[[GÖRÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜK-NAKLAR İÇİNDEŞÜK-NAKLARI: KAYNAKLAR İÇİNDEŞİ İLİŞK KAYNAKLAR İÇİNDEŞİ KAYNAKLAR İÇİNDEŞİ KAYNAKLAR İÇİNDEKİLERİN KAYNAKLAR İÇİNDEKİLERİN KAYNAKLAR İÇİNDEŞİ KAYNAKLARI: KAYNAKLAR KAYNAKLAR KAYNAKLAR İÇİNDEŞİ KAYNAK YARATILAŞMAYORÇLARI KAYNAKLAR İÇİNDEŞİ KAYNAK KAYNAK KAYNAKLAR YARATILAŞTIRMAYORÇLARI YARATILAŞMAYUNUŞİ KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLARI KAYNAKLAR İÇİNDEŞİ KAYNAKLAR KAYNAKLAR İÇİNDEŞÜNİ

Adım 3: Tag Yardımerini Kayıt

Tag yardımcıları, aynı derlemede başvuru olarak otomatik olarak keşfedildi.Eğer etiketiniz yardımcıları ayrı bir sınıf kütüphanesinde ikamet ederse, aENFLT:24) yönergesini eklemeniz gerekir:

@addTagHelper *, MyApp.TagHelpers

Format, belirli yardımseverleri dışlamak için tüm etiket yardımcılarını içerecek şekilde, [[FONTD: 7|3|Sessizler için) veya vahşi bir kartpostal.

Adım 4: Tag Yardımı Bir Razor View

Kayıt yerinde, özel elementi kullanabilirsiniz:

<custom-card title="Welcome" css-class="card-primary">
 This is the body content
</custom-card>

Bu üretir:

<div class="card card-primary">
 <div class="card-header">Welcome</div>
 <div class="card-body">
 This is the body content
 </div>
</div>

Gelişmiş Tag Yardım Teknikleri

Attributes ve Property Binding

Özel etiket yardımcıları karmaşık türleri ve model ifadeleri de dahil olmak üzere birden fazla özellik kabul edebilir. Örneğin, bir form girişi oluşturan bir etiket bir mülkü model ifadesine bağlar:

[HtmlTargetElement("email-input")]
public class EmailInputTagHelper : TagHelper
{
 [HtmlAttributeName("asp-for")]
 public ModelExpression For { get; set; }

 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
 output.TagName = "input";
 output.Attributes.SetAttribute("type", "email");
 output.Attributes.SetAttribute("id", For.Name);
 output.Attributes.SetAttribute("name", For.Name);
 output.Attributes.SetAttribute("value", For.Model?.ToString() ?? "");
 }
}

C# mülkünü belirli bir HTML özelliğine ait haritalar.UseurFLT:34) geçerlilik ve görüntü mantığı ile tam entegrasyon için model metadata'ya erişim sağlar.

Asynchronous Processing

Eğer etiketiniz yardımcı olursa I/O işlemleri (örneğin, bir veritabanından veri almak), aşırılama:FLT:35 yerine:

public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
 var data = await _someService.GetDataAsync();
 output.Content.SetHtmlContent(data);
}

Tag Yardımlayıcısı Bağımlılığı

Tag yardımcıları diğer MVC hizmeti gibi inşaat veya enjeksiyonu destekler. Basitçe olarak kontratöre olan bağımlılığınızı ekleyin ve DI konteyneri bunu çözecektir:

public class UserProfileTagHelper : TagHelper
{
 private readonly IUserService _userService;

 public UserProfileTagHelper(IUserService userService)
 {
 _userService = userService;
 }

 public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
 {
 var user = await _userService.GetCurrentUserAsync();
 // render user profile markup
 }
}

Bu etiket yardımcılarının varsayılan olarak geçici olduğunu unutmayın; yeni bir örnek, bir görüşte her kullanım için oluşturulur.

Tag Global HTML Enjeksiyonu için Bileşenler

ASP.NET Core 2.1,ENFLT:0)Etik Yardımlayıcı Bileşenler[Dönetici: 1), bu senaryolar, stiller veya analizler için genellikle kullanılan her yanıta işaret etmenize izin verir.

public class GlobalScriptTagHelperComponent : TagHelperComponent
{
 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
 if (output.TagName == "body" && output.Attributes.ContainsName("data-scripts"))
 {
 output.PostContent.AppendHtml("<script src='/js/global.js'></script>");
 }
 }
}

// In Startup.ConfigureServices
services.AddTransient<ITagHelperComponent, GlobalScriptTagHelperComponent>();

Karşılaştırma Kompozisyon için Pratik Örnekler

1. koşullu balper Tag Yardımcı

Sadece bir koşul karşılanırsa, yanıtlı düzen konteynerleri için kullanışlı bir elementle şişe içeriği:

[HtmlTargetElement("if-wrapper")]
public class IfWrapperTagHelper : TagHelper
{
 public bool Condition { get; set; }

 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
 if (!Condition)
 {
 // Remove the wrapping element, output only the child content
 output.TagName = null;
 output.Content.SetContent(output.Content.GetContent());
 }
 else
 {
 output.TagName = "div";
 output.Attributes.SetAttribute("class", "wrapper");
 }
 }
}

2. Lazy ile Görüntü ve Srcset

Adaptif bir etiket yardımcısı yaratın: [[Aplakt|sepsiyonel|sahve/düşüküm)

[HtmlTargetElement("lazy-image")]
public class LazyImageTagHelper : TagHelper
{
 public string Src { get; set; }
 public string Srcset { get; set; }
 public string Alt { get; set; }
 public string CssClass { get; set; }

 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
 output.TagName = "img";
 output.Attributes.SetAttribute("src", Src);
 if (!string.IsNullOrEmpty(Srcset))
 output.Attributes.SetAttribute("srcset", Srcset);
 output.Attributes.SetAttribute("alt", Alt);
 output.Attributes.SetAttribute("loading", "lazy");
 if (!string.IsNullOrEmpty(CssClass))
 output.Attributes.SetAttribute("class", CssClass);
 }
}

3. Özel Yapı ile Geçerlilik Özeti

Yapılı doğrulama özet etiketi yardımcısını kullanmak yerine, özel simgeleri ve stili içeren bir tane oluşturun:

[HtmlTargetElement("custom-validation-summary")]
public class CustomValidationSummaryTagHelper : TagHelper
{
 [HtmlAttributeName("asp-validation-summary")]
 public ValidationSummary ValidationSummary { get; set; }

 [ViewContext]
 public ViewContext ViewContext { get; set; }

 public override void Process(TagHelperContext context, TagHelperOutput output)
 {
 var viewData = ViewContext.ViewData;
 var errors = viewData.ModelState.Where(s => s.Value.Errors.Count > 0).SelectMany(s => s.Value.Errors).ToList();

 if (errors.Count == 0)
 {
 output.SuppressOutput();
 return;
 }

 output.TagName = "div";
 output.Attributes.SetAttribute("class", "alert alert-danger");
 var list = new StringBuilder();
 list.Append("<ul class='mb-0'>");
 foreach (var error in errors)
 {
 list.Append($"<li><strong>Error:</strong> {error.ErrorMessage}</li>");
 }
 list.Append("</ul>");
 output.Content.SetHtmlContent(list.ToString());
 }
}

Bina için En İyi Uygulamalar Tag Yardımcılar

  • [FONT:0) C# mantık minimum tut - Tag yardımcılar sunum dönüşümü için, iş mantığına ihtiyacınız varsa, karmaşık veri işlemeye ihtiyacınız varsa, bir görünüm bileşeni veya hizmeti kullanın.
  • [FONT:0) I/O [DÜDÜDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜŞÜNÜŞÜNÜŞÜNÜŞÜN
  • [FONT:0) Özel elementler için tanımlayıcı isimler [Dönetici: 1) - gelecekteki HTML standartlarına uygun çarpışmalardan kaçınmak için bir kongreyi takip edin.
  • [FONT:0]LeverageZEFLT:50] - İşaretlerden ayarlanmamış iç özellikler için, onları bu özellikle işaretleyin.
  • [[0) Oluşturulan HTML[[Döneticileri) test edin - etiketi yardımcı olan birim testleri yazın, [[Döntgen:0) ve [[Döneticileri kullanarak doğrulayın.
  • [FONT:0)İklim erişilebilirliği)[Uygunluklar ve klavye desteği dahil.

Ortak Pitfalls ve Sorun Gidering

  • [FONT=0)Etik yardımseverler ([Dönetici: 1 ) - Doğru montaja işaret eden yönergeye göre, ad alanı ve sınıf adı doğrulayın.
  • [[DÜŞÜNÜ:0)Attribute isimleri eşleşen değil[[DÜT:1) – C# mülk isimlerini HTML özellikleri isimlerine göre C# mülk adı altından sipariş edilen adlar C# mülk adı kullanılır.
  • [FONT:0]Yaptent'ı göndermez[[[Döntilmiş: 1 ) – Eğer çocuk içeriğine yeniden dönmeden önce, orijinal iç HTML'yi kaybedersiniz.Her zaman ihtiyacınız varsa.
  • [FONT:0) Çok sayıda etiket aynı elementi hedef alan yardımcı olur – Uygulamanın siparişi varsayılan olarak alfabetik siparişi takip eder ancak [[T:58|mükemmel mülkiyetle kontrol edilebilir.
  • [FONT:0)Dependency enjeksiyon sorunları[[DÜT 1: 1) – Tag yardımcıları tekton kapsamı değildir.Eğer bir kapsamız hizmeti enjekte ederseniz, aynı HTTP isteği kapsamı içinde etiket yardımının tüketilmesini sağlar (normalde).

Tümleştirme Özel Tag Yardımcıları Varaktan Bir Kodbase

Özel etiket yardımcıları tam bir yeniden yazma gerektirmez.En tekrarlanan kalıpları yeniden faktörle başlayabilirsiniz - düğmeler, kartlar veya veri masaları gibi - tag yardımcıları içine almak için bir kütüphane inşa edersiniz, UI bileşenleriniz için tek bir etiket yardımı oluşturursunuz.

Dış Kaynaklar ve Daha Fazla Okuma

  • [FONT=0) ASP.NET Core (resmi belgeler)).
  • [FONT:0)Yazan Tag Yardımcılar (resmi belgeler)).
  • [FONT:0)Etik Yardımlayıcı Bileşenleri (resmi belgeler)).
  • [FONT:0]Bir Lock'un serisini özel etiket yardımcıları üzerine çekti).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

Özel etiket yardımcıları, geliştiricilerin ASP.NET Core MVC'de nasıl görüntülendiğini önemli bir evrim temsil ediyor.Kendi HTML elementlerini ve özelliklerini sunucunun mantığını yürütmenize izin vererek, tasarım dostu markalama ve programcı kontrol arasındaki boşluğu yeniden kurdular.Bu teknik, bağımlılıkla entegre eden, test edilebilir ve tutarlı kullanıcı arayüzlerini sürdürmenize yardımcı oluyor.