Aracılığıyla paylaş


ASP.NET Core Razor bileşenleri

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 9 sürümüne bakın.

Bu makalede Razor uygulamalarında Blazor bileşenleri oluşturma ve kullanma işlemleri açıklanır, ayrıca Razor söz dizimi, bileşen adlandırması, ad alanları ve bileşen parametreleri hakkında rehberlik sağlanır.

Razor bileşenleri

Blazor uygulamalar, Razor bileşenler kullanılarak oluşturulur ve bu bileşenler, gayri resmi olarak Blazor bileşenler veya yalnızca bileşenler olarak bilinir. Bileşen, kullanıcı arabiriminin (UI) dinamik davranışı etkinleştirmek için işleme mantığına sahip, bağımsız çalışan bir bölümüdür. Bileşenler iç içe geçirilebilir, yeniden kullanılabilir, projeler arasında paylaşılabilir ve MVC ve Razor Sayfalar uygulamalarında kullanılabilir.

Bileşenler, kullanıcı arabirimini esnek ve verimli bir şekilde güncelleştirmek için kullanılan işleme ağacı olarak adlandırılan tarayıcının Belge Nesne Modeli'nin (DOM) bellek içi gösterimine işlenir.

"Razor Bileşenler" bazı adlandırmaları diğer ASP.NET Core içerik işleme teknolojileriyle paylaşsa da, Razor bileşenler ASP.NET Core'daki aşağıdaki farklı özelliklerden ayırt edilmelidir:

Önemli

Bir Blazor Web App kullanırken, Blazor belge örneği bileşenlerinin çoğu, makalelerde ele alınan kavramların çalışabilmesi ve gösterilebilmesi için etkileşimli olmayı gerektirir. Etkileşim, kullanıcıların işlenmiş bileşenlerle etkileşim kurmasını mümkün kılar. Bu, Belge Nesne Modeli (DOM) olaylara yönelik uygulama yanıtlarını ve Blazorolay işleyicileri ve bağlama yoluyla C# üyelerine bağlı durum değişikliklerini içerir. Bir makale tarafından sağlanan örnek bir bileşeni Blazor Web Appiçinde test ettiğinizde, uygulamanın genel etkileşimli çalışma özelliğini benimsediğinden veya bileşenin etkileşimli işleme modunu kullandığından emin olun. Bu konu hakkında daha fazla bilgi, bu makaleden sonraki içindekiler tablosundaki bir sonraki makale olan ASP.NET Core Blazor işleme modları tarafından sağlanır.

Bileşen sınıfları

Bileşenler, Razor dosya uzantısına sahip .razor bileşen dosyalarında C# ile HTML işaretlemesinin bir bileşimini kullanarak uygulanır.

ComponentBase , bileşen dosyaları tarafından Razor açıklanan bileşenler için temel sınıftır. ComponentBase, bileşenlerin en düşük soyutlaması olan IComponent arabirimini uygular. ComponentBase temel işlevlere yönelik bileşen özelliklerini ve yöntemlerini tanımlar; örneğin, yerleşik bileşen yaşam döngüsü olaylarını işlemek için.

ComponentBasebaşvuru kaynağındadotnet/aspnetcore: Başvuru kaynağı, yerleşik yaşam döngüsü olaylarıyla ilgili ek açıklamalar içerir. Ancak, bileşen özelliklerinin iç uygulamalarının herhangi bir zamanda bildirimde bulunmadan değiştirilebilir olduğunu unutmayın.

Not

.NET başvuru kaynağına yönelik belge bağlantıları genellikle deponun varsayılan dalını yükler ve bu dal .NET'in sonraki sürümü için geçerli geliştirmeyi temsil eder. Belirli bir sürümün etiketini seçmek için Dalları veya etiketleri değiştir açılır listesini kullanın. Daha fazla bilgi için bkz. ASP.NET Core kaynak kodunun sürüm etiketini seçme (dotnet/AspNetCore.Docs #26205).

Geliştiriciler genellikle Razor bileşenlerini Razor bileşen dosyalarından (.razor) oluşturur veya ComponentBase üzerine temel alır, ancak bileşenler IComponent uygulanarak da oluşturulabilir. Geliştirici tarafından oluşturulmuş ve IComponent uygulayan bileşenler, geliştiricinin oluşturup sürdürmesi gereken olaylar ve yaşam döngüsü yöntemleriyle işleme sürecini daha düşük seviyede kontrol edebilir.

Belge örnek kodu ve örnek uygulamalar tarafından Blazor benimsenen ek kurallar ASP.NET Temel Blazor bilgiler bölümünde bulunur.

Razor söz dizimi

Bileşenler Razor söz dizimini kullanır. İki Razor özelliği bileşenler tarafından yaygın olarak kullanılır: yönergeler ve yönerge öznitelikleri. Bunlar, Razor işaretlemesinde görünen ve @ önekiyle başlayan ayrılmış anahtar sözcüklerdir.

  • Yönergeler: Bileşen işaretlemesinin derlenme şeklini veya işlevlerini değiştirin. Örneğin yönergesi, @page kullanıcının tarayıcıda belirli bir URL'deki isteğiyle doğrudan ulaşabileceğiniz yönlendirme şablonuna sahip yönlendirilebilir bir bileşen belirtir.

    Kural gereği, bir bileşenin bir bileşen tanımının (.razor dosya) en üstündeki yönergeleri tutarlı bir sırada yerleştirilir. Yinelenen yönergeler için yönergeler, özel ikinci düzey sıralamaya sahip yönergeler dışında @using ad alanına veya türe göre alfabetik olarak yerleştirilir.

    Örnek uygulamalar ve belgeler tarafından aşağıdaki sıra benimsenmiştir. Proje Blazor şablonu tarafından sağlanan bileşenler aşağıdaki sıraylan farklı olabilir ve farklı bir biçim kullanabilir. Örneğin, çerçeve bileşenleri yönerge Blazor blokları ile yönerge @using blokları @inject arasında boş satırlar içerir. Kendi uygulamalarınızda özel bir sipariş düzeni ve biçimi kullanabilirsiniz.

    Belgeler ve örnek uygulama Razor yönerge sırası:

    • @page
    • @rendermode (.NET 8 veya üzeri)
    • @using
      • System ad alanları (alfabetik sıra)
      • Microsoft ad alanları (alfabetik sıra)
      • Üçüncü taraf API ad alanları (alfabetik sıra)
      • Uygulama ad alanları (alfabetik sıra)
    • Diğer yönergeler (alfabetik sıra)

    Not

    işleme modu yalnızca Blazor Web App'lerde uygulanır ve işlenen bileşenle kullanıcı etkileşimi sağlayan modlar içerir. Daha fazla bilgi için bkz . ASP.NET Core Blazor işleme modları.

    Yönergeler arasında boş satır görünmez. Yönergeler ile işaretlemenin ilk satırı arasında boş bir satır Razor görünür.

    Örnek:

    @page "/doctor-who-episodes/{season:int}"
    @rendermode InteractiveWebAssembly
    @using System.Globalization
    @using System.Text.Json
    @using Microsoft.AspNetCore.Localization
    @using Mandrill
    @using BlazorSample.Components.Layout
    @attribute [Authorize]
    @implements IAsyncDisposable
    @inject IJSRuntime JS
    @inject ILogger<DoctorWhoEpisodes> Logger
    
    <PageTitle>Doctor Who Episode List</PageTitle>
    
    ...
    
  • Yönerge öznitelikleri: Bileşen öğesinin derlenmiş veya işlev biçimini değiştirin.

    Örnek:

    <input @bind="episodeId" />
    

    Yönerge öznitelik değerlerini açık olmayan Razor ifadeler için at simgesi (@) ile ön ekleyebilirsiniz, ancak bunu önermeyiz ve belgeler, örneklerde bu yaklaşımı kullanmaz.

Bileşenlerde kullanılan yönergeler ve yönerge öznitelikleri bu makalede ve Blazor belge kümesinin diğer makalelerinde ayrıntılı olarak açıklanmıştır. Razor söz dizimi hakkında genel bilgiler için bkz. ASP.NET Core için Razor söz dizimi başvurusu.

Bileşen adı, sınıf adı ve ad alanı

Bileşenin adı büyük harfle başlamalıdır:

Destekli:ProductDetail.razor

Desteklenmeyen:productDetail.razor

Tüm Blazor belgelerinde kullanılan yaygın Blazor adlandırma kuralları şunlardır:

  • Dosya yolları ve dosya adları Pascal Case kullanır ve kod örnekleri gösterilmeden önce yer alır. Bir yol varsa, tipik klasör konumunu gösterir. Örneğin, Components/Pages/ProductDetail.razor bileşenin dosya adına ProductDetail.razor olan ve uygulamanın Components klasörünün Pages adlı klasöründe bulunan bir dosyaya sahip olduğunu gösterir.
  • Yönlendirilebilir bileşenler için bileşen dosyası yolları, "kebab case" formatında URL'lerle eşleşir ve bir bileşenin rota şablonundaki sözcükler arasında kısa çizgiler bulunur. Örneğin ProductDetail yönlendirme şablonu olan /product-detail bileşeni (@page "/product-detail") tarayıcıda /product-detail göreli URL'sinde istendi.

†Pascal Biçimi (Deve Büyük Harf) boşluk veya noktalama işareti kullanmaksızın, her sözcüğün, ilk sözcük dahil, ilk harfinin büyük yazıldığı bir adlandırma kuralıdır.
‡Kebab case, boşluklar ve noktalama işaretleri olmadan, küçük harfler ve kelimeler arasında tireler kullanan bir adlandırma kuralıdır.

Bileşenler sıradan C# sınıflarıdır ve proje içinde herhangi bir konuma yerleştirilebilir. Web sayfaları üreten bileşenler Components/Pages klasöründe yer alır. Sayfa üretmeyen bileşenler sıklıkla Components klasörüne veya projeye eklenen bir özel klasöre yerleştirilir.

Normal olarak bileşenin ad alanı, uygulamanın kök ad alanından ve uygulama içindeki bileşen konumundan (klasör) türetilir. Uygulamanın kök ad alanı BlazorSample ise ve Counter bileşeni Components/Pages klasöründe yer alıyorsa:

  • Counter bileşeninin ad alanı BlazorSample.Components.Pages olur.
  • Bileşenin tam tür adı şöyledir: BlazorSample.Components.Pages.Counter.

Bileşenleri barındıran özel klasörler için, üst bileşene veya uygulamanın @using dosyasına _Imports.razor yönergesini ekleyin. Aşağıdaki örnek AdminComponents klasöründeki bileşenleri kullanılabilir duruma getirir:

@using BlazorSample.AdminComponents

Not

@using dosyasındaki _Imports.razor yönergeleri yalnızca Razor dosyalarına (.razor) uygulanır; C# dosyalarına (.cs) uygulanmaz.

Diğer adla belirtilmiş using ifadeler desteklenir. Aşağıdaki örnekte, bileşenin WeatherForecast genel GridRendering sınıfı, uygulamanın başka bir yerindeki bir bileşende WeatherForecast olarak kullanılabilir hale getirilir.

@using WeatherForecast = Components.Pages.GridRendering.WeatherForecast

Bileşenlere tam adları kullanılarak da başvurulabilir ve bu durumda bir @using yönergesi gerekmez. Aşağıdaki örnek, uygulamanın ProductDetail klasöründe yer alan AdminComponents/Pages bileşenine doğrudan başvurur:

<BlazorSample.AdminComponents.Pages.ProductDetail />

Razor ile yazılan bileşenin ad alanı aşağıdakilere dayanır (öncelik sırasıyla):

  • @namespace dosyasının işaretlemesindeki Razor yönergesi (örneğin @namespace BlazorSample.CustomNamespace).
  • Projenin proje dosyasındaki RootNamespace (örneğin <RootNamespace>BlazorSample</RootNamespace>).
  • Proje ad alanı ve proje kökünden bileşene giden yol. Örneğin, {PROJECT NAMESPACE}/Components/Pages/Home.razor projesinin ad alanını BlazorSample ile, Home bileşeni için BlazorSample.Components.Pages ad alanına çözer. {PROJECT NAMESPACE} proje ad alanıdır. Bileşenler C# adı bağlama kurallarına uyar. Bu örnekteki Home bileşen için kapsamdaki bileşenlerin tümü bileşenlerdir:
    • Aynı Components/Pages klasöründe yer alanlar.
    • Projenin kökünde yer alan ve açıkça farklı bir ad alanı belirtmeyen bileşenler.

Aşağıdakiler desteklenmez:

  • global:: nitelemesi.
  • Kısmen nitelenmiş adlar. Örneğin bir bileşene @using BlazorSample.Components ekleyip ardından uygulamanın NavMenu klasöründeki Components/Layout bileşenine (Components/Layout/NavMenu.razor) <Layout.NavMenu></Layout.NavMenu> ile başvuramazsınız.

Bileşenin adı büyük harfle başlamalıdır:

Destekli:ProductDetail.razor

Desteklenmeyen:productDetail.razor

Tüm Blazor belgelerinde kullanılan yaygın Blazor adlandırma kuralları şunlardır:

  • Dosya yolları ve dosya adları Pascal Case kullanılarak, kod örneklerinden önce görünür. Bir yol varsa, tipik klasör konumunu gösterir. Örneğin Pages/ProductDetail.razor yolu, ProductDetail bileşeninin dosya adının ProductDetail.razor olduğunu ve bileşenin uygulamanın Pages klasöründe bulunduğunu gösterir.
  • Yönlendirilebilir bileşenler için bileşen dosya yolları, kebap usulü URL'leriyle eşleşir ve bir bileşenin rota şablonu içerisindeki sözcükler arasında kısa çizgiler kullanılır. Örneğin ProductDetail yönlendirme şablonu olan /product-detail bileşeni (@page "/product-detail") tarayıcıda /product-detail göreli URL'sinde istendi.

†Pascal durumu (büyük harfle başlayan camelCase), boşluk ve noktalama işareti içermeyen, ilk sözcük de dahil olmak üzere her sözcüğün ilk harfinin büyük yazıldığı bir adlandırma kuralıdır.
‡Kebab-case, sözcükler arasında küçük harfler ve tireler kullanan, boşluk veya noktalama işareti içermeyen bir adlandırma kuralıdır.

Bileşenler sıradan C# sınıflarıdır ve proje içinde herhangi bir konuma yerleştirilebilir. Web sayfaları üreten bileşenler Pages klasöründe yer alır. Sayfa üretmeyen bileşenler sıklıkla Shared klasörüne veya projeye eklenen bir özel klasöre yerleştirilir.

Normal olarak bileşenin ad alanı, uygulamanın kök ad alanından ve uygulama içindeki bileşen konumundan (klasör) türetilir. Uygulamanın kök ad alanı BlazorSample ise ve Counter bileşeni Pages klasöründe yer alıyorsa:

  • Counter bileşeninin ad alanı BlazorSample.Pages olur.
  • Bileşenin tam tür adı şöyledir: BlazorSample.Pages.Counter.

Bileşenleri barındıran özel klasörler için, üst bileşene veya uygulamanın @using dosyasına _Imports.razor yönergesini ekleyin. Aşağıdaki örnek AdminComponents klasöründeki bileşenleri kullanılabilir duruma getirir:

@using BlazorSample.AdminComponents

Not

@using dosyasındaki _Imports.razor yönergeleri yalnızca Razor dosyalarına (.razor) uygulanır; C# dosyalarına (.cs) uygulanmaz.

Diğer ad verilmiş using ifadeler desteklenir. Aşağıdaki örnekte, bileşenin WeatherForecast genel GridRendering sınıfı, uygulamanın başka bir yerindeki bir bileşende WeatherForecast olarak kullanılabilir.

@using WeatherForecast = Pages.GridRendering.WeatherForecast

Bileşenlere tam adları kullanılarak da başvurulabilir ve bu durumda bir @using yönergesi gerekmez. Aşağıdaki örnek, uygulamanın ProductDetail klasöründe yer alan Components bileşenine doğrudan başvurur:

<BlazorSample.Components.ProductDetail />

Razor ile yazılan bileşenin ad alanı aşağıdakilere dayanır (öncelik sırasıyla):

  • @namespace dosyasının işaretlemesindeki Razor yönergesi (örneğin @namespace BlazorSample.CustomNamespace).
  • Projenin proje dosyasındaki RootNamespace (örneğin <RootNamespace>BlazorSample</RootNamespace>).
  • Proje ad alanı ve proje kökünden bileşene giden yol. Örneğin, çerçeve, {PROJECT NAMESPACE}/Pages/Index.razor proje ad alanını BlazorSample ile Index bileşeni için BlazorSample.Pages ad alanına çözümler. {PROJECT NAMESPACE} proje ad alanıdır. Bileşenler C# adı bağlama kurallarına uyar. Bu örnekteki Index bileşen için kapsamdaki bileşenlerin tümü bileşenlerdir:
    • Aynı Pages klasöründe yer alanlar.
    • Projenin kökünde yer alan ve açıkça farklı bir ad alanı belirtmeyen bileşenler.

Aşağıdakiler desteklenmez:

  • global:: nitelemesi.
  • Kısmen nitelenmiş adlar. Örneğin bir bileşene @using BlazorSample ekleyip ardından uygulamanın NavMenu klasöründeki Shared bileşenine (Shared/NavMenu.razor) <Shared.NavMenu></Shared.NavMenu> ile başvuramazsınız.

Kısmi sınıf desteği

Bileşenler C# kısmi sınıfları olarak oluşturulur ve aşağıdaki yaklaşımlardan biri kullanılarak yazılır:

  • Tek bir dosya bir veya birden fazla @code bloğunda tanımlanan C# kodunu, HTML işaretlemesini ve Razor işaretlemesini içerir. Blazor proje şablonları bileşenlerini bu tek dosya yaklaşımını kullanarak tanımlar.
  • HTML ve Razor işaretlemesi Razor dosyasına (.razor) yerleştirilir. C# kodu kısmi sınıf olarak arka plan kod dosyasına yerleştirilir (.cs).

Not

Bileşene özgü stillerin tanımlandığı bileşen stil sayfası ayrı bir dosyadır (.css). Blazor CSS yalıtımı daha sonra ASP.NET Core Blazor CSS yalıtımı bölümünde açıklanır.

Aşağıdaki örnekte Counter proje şablonundan oluşturulan bir uygulamada @code bloğunu içeren varsayılan Blazor bileşeni gösterilir. İşaretleme ve C# kodu aynı dosyadadır. Bu, bileşen yazılırken benimsenen en yaygın yaklaşımdır.

Counter.razor:

@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount() => currentCount++;
}
@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount() => currentCount++;
}
@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
@page "/counter"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
@page "/counter"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

Aşağıdaki Counter bileşen, kısmi sınıfa sahip bir arkaplan kod dosyası kullanarak sunu HTML'sini ve Razor işaretlemesini C# kodundan ayırır. İşaretlemeyi C# kodundan bölmek, bazı kuruluşlar ve geliştiriciler tarafından bileşen kodlarını çalışmayı tercih ettikleri şekilde düzenlemek için tercih edilir. Örneğin, kuruluşun kullanıcı arabirimi uzmanı, bileşenin C# mantığı üzerinde çalışan başka bir geliştiriciden bağımsız olarak sunu katmanı üzerinde çalışabilir. Yaklaşım, otomatik olarak oluşturulan kod veya kaynak oluşturucularla çalışırken de kullanışlıdır. Daha fazla bilgi için bkz . Kısmi Sınıflar ve Yöntemler (C# Programlama Kılavuzu).

CounterPartialClass.razor:

@page "/counter-partial-class"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@page "/counter-partial-class"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@page "/counter-partial-class"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@page "/counter-partial-class"

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@page "/counter-partial-class"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@page "/counter-partial-class"

<h1>Counter</h1>

<p>Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

CounterPartialClass.razor.cs:

namespace BlazorSample.Components.Pages;

public partial class CounterPartialClass
{
    private int currentCount = 0;

    private void IncrementCount() => currentCount++;
}
namespace BlazorSample.Components.Pages;

public partial class CounterPartialClass
{
    private int currentCount = 0;

    private void IncrementCount() => currentCount++;
}
namespace BlazorSample.Pages;

public partial class CounterPartialClass
{
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}
namespace BlazorSample.Pages
{
    public partial class CounterPartialClass
    {
        private int currentCount = 0;

        private void IncrementCount()
        {
            currentCount++;
        }
    }
}

@using dosyasındaki _Imports.razor yönergeleri yalnızca Razor dosyalarına (.razor) uygulanır; C# dosyalarına (.cs) uygulanmaz. Kısmi sınıf dosyasına gereken ad alanlarını ekleyin.

Bileşenler tarafından kullanılan tipik ad alanları:

using System.Net.Http;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Sections
using Microsoft.AspNetCore.Components.Web;
using static Microsoft.AspNetCore.Components.Web.RenderMode;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;

Tipik ad alanları uygulamanın ad alanını ve uygulamanın Components klasörüne karşılık gelen ad alanını da içerir:

using BlazorSample;
using BlazorSample.Components;

Ek klasörler dahil edilebilir, örneğin Layout klasörü:

using BlazorSample.Components.Layout;
using System.Net.Http;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;

Tipik ad alanları uygulamanın ad alanını ve uygulamanın Shared klasörüne karşılık gelen ad alanını da içerir:

using BlazorSample;
using BlazorSample.Shared;
using System.Net.Http;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.JSInterop;

Tipik ad alanları uygulamanın ad alanını ve uygulamanın Shared klasörüne karşılık gelen ad alanını da içerir:

using BlazorSample;
using BlazorSample.Shared;

Temel sınıf belirtme

Bileşenin temel sınıfını belirtmek için @inherits yönergesi kullanılır. Yalnızca C# mantığından işaretlemeyi bölen kısmi sınıfların aksine, temel sınıf kullanmak temel sınıfın özelliklerini ve yöntemlerini paylaşan bir bileşen grubu genelinde kullanmak üzere C# kodunu devralmanıza olanak tanır. Temel sınıfların kullanılması uygulamalarda kod yedekliliğini azaltır ve sınıf kitaplıklarından birden çok uygulama için temel kod sağlarken yararlıdır. Daha fazla bilgi için bkz C# ve .NET'te Kalıtım.

Aşağıdaki örnekte temel BlazorRocksBase1 sınıf öğesinden ComponentBasetüretilmiştir.

BlazorRocks1.razor:

@page "/blazor-rocks-1"
@inherits BlazorRocksBase1

<PageTitle>Blazor Rocks!</PageTitle>

<h1>Blazor Rocks! Example 1</h1>

<p>
    @BlazorRocksText
</p>
@page "/blazor-rocks-1"
@inherits BlazorRocksBase1

<PageTitle>Blazor Rocks!</PageTitle>

<h1>Blazor Rocks! Example 1</h1>

<p>
    @BlazorRocksText
</p>
@page "/blazor-rocks-1"
@inherits BlazorRocksBase1

<PageTitle>Blazor Rocks!</PageTitle>

<h1>Blazor Rocks! Example 1</h1>

<p>
    @BlazorRocksText
</p>
@page "/blazor-rocks-1"
@inherits BlazorRocksBase1

<PageTitle>Blazor Rocks!</PageTitle>

<h1>Blazor Rocks! Example 1</h1>

<p>
    @BlazorRocksText
</p>
@page "/blazor-rocks-1"
@inherits BlazorRocksBase1

<h1>Blazor Rocks! Example 1</h1>

<p>
    @BlazorRocksText
</p>
@page "/blazor-rocks-1"
@inherits BlazorRocksBase1

<h1>Blazor Rocks! Example 1</h1>

<p>
    @BlazorRocksText
</p>

BlazorRocksBase1.cs:

using Microsoft.AspNetCore.Components;

namespace BlazorSample;

public class BlazorRocksBase1 : ComponentBase
{
    public string BlazorRocksText { get; set; } = "Blazor rocks the browser!";
}
using Microsoft.AspNetCore.Components;

namespace BlazorSample;

public class BlazorRocksBase1 : ComponentBase
{
    public string BlazorRocksText { get; set; } = "Blazor rocks the browser!";
}
using Microsoft.AspNetCore.Components;

namespace BlazorSample;

public class BlazorRocksBase1 : ComponentBase
{
    public string BlazorRocksText { get; set; } =
        "Blazor rocks the browser!";
}
using Microsoft.AspNetCore.Components;

namespace BlazorSample;

public class BlazorRocksBase1 : ComponentBase
{
    public string BlazorRocksText { get; set; } =
        "Blazor rocks the browser!";
}
using Microsoft.AspNetCore.Components;

namespace BlazorSample;

public class BlazorRocksBase1 : ComponentBase
{
    public string BlazorRocksText { get; set; } =
        "Blazor rocks the browser!";
}
using Microsoft.AspNetCore.Components;

namespace BlazorSample;

public class BlazorRocksBase1 : ComponentBase
{
    public string BlazorRocksText { get; set; } =
        "Blazor rocks the browser!";
}

Yönlendirme

Blazor'da yönlendirme, uygulamadaki her erişilebilir bileşene @page yönergesiyle bir yönlendirme şablonu sağlama yoluyla elde edilir. Razor yönergesini içeren bir @page dosyası derlendiğinde, oluşturulan sınıfa yönlendirme şablonunu belirten bir RouteAttribute verilir. Çalışma zamanında yönlendirici RouteAttribute içeren bileşen sınıflarını arar ve istenen URL'yle eşleşen yönlendirme şablonuna sahip olan bileşeni işler.

Aşağıdaki HelloWorld bileşeni bir yol şablonu olan /hello-world kullanır ve bileşenin işlenen web sayfasına, göreli URL /hello-world üzerinden ulaşılır.

HelloWorld.razor:

@page "/hello-world"

<PageTitle>Hello World!</PageTitle>

<h1>Hello World!</h1>
@page "/hello-world"

<PageTitle>Hello World!</PageTitle>

<h1>Hello World!</h1>
@page "/hello-world"

<h1>Hello World!</h1>
@page "/hello-world"

<h1>Hello World!</h1>
@page "/hello-world"

<h1>Hello World!</h1>
@page "/hello-world"

<h1>Hello World!</h1>

Bileşeni uygulamanın kullanıcı arabirimi gezintisine ekleyip eklemediğinize bakılmaksızın, tarayıcıda /hello-world konumunda önceki bileşen yüklenir. İsteğe bağlı olarak bileşenler NavMenu bileşenine eklenebilir ve böylelikle bileşenin bağlantısı uygulamanın kullanıcı arabirimi tabanlı gezintisinde görünür.

Önceki HelloWorld bileşeni için, NavMenu bileşenine bir NavLink bileşeni ekleyebilirsiniz. Daha fazla bilgi edinmek ve NavLink ile NavMenu bileşenlerinin açıklamalarını görmek için bkz. ASP.NET Core Blazor yönlendirme ve gezintisi.

İşaretleme

Bir bileşenin kullanıcı arabirimi, Razor söz dizimi kullanılarak tanımlanır ve bu, Razor işaretlemesi, C# ve HTML'den oluşur. Uygulama derlenirken HTML işaretlemesi ile C# işleme mantığı bir bileşen sınıfına dönüştürülür. Oluşturulan sınıfın adı dosyanın adıyla eşleşir.

Bileşen sınıfının üyeleri bir veya birden fazla @code bloğunda tanımlanır. @code bloklarında bileşen durumu C# ile belirtilir ve işlenir:

  • Özellik ve alan başlatıcıları.
  • Ebeveyn bileşenler ve rota parametreleri tarafından aktarılan bağımsız değişkenlerden parametre değerleri.
  • Kullanıcı olayı işleme yöntemleri, yaşam döngüsü olayları ve özel bileşen mantığı.

Bileşen üyeleri @ sembolüyle başlayan C# ifadelerini kullanan işleme mantığında kullanılır. Örneğin C# alanı, alan adına @ ön eki eklenerek işlenir. Aşağıdaki Markup bileşeni şunları değerlendirir ve işler:

  • Başlık öğesinin font-style CSS özellik değeri için headingFontStyle.
  • Başlık öğesinin içeriği için headingText.

Markup.razor:

@page "/markup"

<PageTitle>Markup</PageTitle>

<h1>Markup Example</h1>

<h2 style="font-style:@headingFontStyle">@headingText</h2>

@code {
    private string headingFontStyle = "italic";
    private string headingText = "Put on your new Blazor!";
}
@page "/markup"

<PageTitle>Markup</PageTitle>

<h1>Markup Example</h1>

<h2 style="font-style:@headingFontStyle">@headingText</h2>

@code {
    private string headingFontStyle = "italic";
    private string headingText = "Put on your new Blazor!";
}
@page "/markup"

<h1 style="font-style:@headingFontStyle">@headingText</h1>

@code {
    private string headingFontStyle = "italic";
    private string headingText = "Put on your new Blazor!";
}
@page "/markup"

<h1 style="font-style:@headingFontStyle">@headingText</h1>

@code {
    private string headingFontStyle = "italic";
    private string headingText = "Put on your new Blazor!";
}
@page "/markup"

<h1 style="font-style:@headingFontStyle">@headingText</h1>

@code {
    private string headingFontStyle = "italic";
    private string headingText = "Put on your new Blazor!";
}
@page "/markup"

<h1 style="font-style:@headingFontStyle">@headingText</h1>

@code {
    private string headingFontStyle = "italic";
    private string headingText = "Put on your new Blazor!";
}

Not

Tüm Blazor belgelerindeki örnekler özel üyeler için private erişim değiştiricisini belirtir. Özel üyeler bir bileşenin sınıfıyla sınırlıdır. Bununla birlikte hiç erişim değiştiricisi olmadığında C# varsayılan olarak private erişim değiştiricisini kullanır, dolayısıyla kendi kodunuzda üyeleri açıkça "private" olarak işaretlemek isteğe bağlıdır. Erişim değiştiricileri hakkında daha fazla bilgi için bkz. Erişim Değiştiricileri (C# Programlama Kılavuzu).

ÇerçeveBlazor, bir bileşenin DOM ve Basamaklı Stil Sayfası Nesne Modeli'nin (CSSOM) birleşimi olan bir işleme ağacı olarak dahili olarak işler. Bileşen başlangıçta işlendikten sonra olaylara yanıt olarak bileşenin işleme ağacı yeniden oluşturulur. Blazor yeni işleme ağacını önceki işleme ağacıyla karşılaştırır ve tüm değişiklikleri görüntüleme için tarayıcının Belge Nesne Modeli'ne (DOM) uygular. Daha fazla bilgi için bkz. ASP.NET Core Razor bileşenini işleme.

C# denetim yapıları, yönergeleri ve yönerge öznitelikleri için Razor söz dizimi küçük harftir (örnekler: @if, @code, @bind). Özellik adları büyük harf yazılır (örnek: @Body için LayoutComponentBase.Body).

Zaman uyumsuz yöntemler (async) void döndürmeyi desteklemez

Blazor çerçevesi void döndüren zaman uyumsuz yöntemleri (async) izlemez. Sonuç olarak void döndürülürse özel durumlar yakalanmaz. Asenkron yöntemlerden her zaman bir Task döndürün.

İç içe yerleştirilmiş bileşenler

Bileşenler HTML söz dizimini kullanıp bildirimde bulunarak diğer bileşenleri içerebilir. Bileşen kullanmaya yönelik işaretleme HTML etiketine benzer; burada etiketin adı bileşen türüdür.

Diğer bileşenler tarafından başlık görüntülemek için kullanılabilen şu Heading bileşenini düşünün.

Heading.razor:

<h1 style="font-style:@headingFontStyle">Heading Example</h1>

@code {
    private string headingFontStyle = "italic";
}
<h1 style="font-style:@headingFontStyle">Heading Example</h1>

@code {
    private string headingFontStyle = "italic";
}
<h1 style="font-style:@headingFontStyle">Heading Example</h1>

@code {
    private string headingFontStyle = "italic";
}
<h1 style="font-style:@headingFontStyle">Heading Example</h1>

@code {
    private string headingFontStyle = "italic";
}
<h1 style="font-style:@headingFontStyle">Heading Example</h1>

@code {
    private string headingFontStyle = "italic";
}
<h1 style="font-style:@headingFontStyle">Heading Example</h1>

@code {
    private string headingFontStyle = "italic";
}

HeadingExample bileşeninde yer alan aşağıdaki işaretleme, Heading etiketinin gösterildiği konumda önceki <Heading /> bileşenini işler.

HeadingExample.razor:

@page "/heading-example"

<PageTitle>Heading</PageTitle>

<h1>Heading Example</h1>

<Heading />
@page "/heading-example"

<PageTitle>Heading</PageTitle>

<h1>Heading Example</h1>

<Heading />
@page "/heading-example"

<Heading />
@page "/heading-example"

<Heading />
@page "/heading-example"

<Heading />
@page "/heading-example"

<Heading />

Bileşen, büyük harfle başlayan ve aynı ad alanı içinde bileşen adıyla eşleşmeyen bir HTML öğesi içeriyorsa, öğenin beklenmeyen bir adı olduğunu belirten bir uyarı gösterilir. Bileşenin ad alanı için @using yönergesinin eklenmesi bileşeni kullanılabilir duruma getirir ve bu da uyarıyı çözer. Daha fazla bilgi için Bileşen adı, sınıf adı ve ad alanı bölümüne bakın.

Bu bölümde gösterilen örnek Heading bileşeninin @page yönergesi yoktur, dolayısıyla Heading bileşenine kullanıcı tarayıcıda yapılan bir istekle doğrudan erişemez. Öte yandan @page yönergesi olan tüm bileşenler başka bileşenlerle iç içe yerleştirilebilir. Heading bileşeni @page "/heading" dosyasının üstüne Razor eklenerek doğrudan erişilebilir yapılsaydı, bileşen hem /heading hem de /heading-example konumunda tarayıcı istekleri için işlenebilirdi.

Bileşen parametreleri

Bileşen parametreleri verileri bileşenlere geçirir ve bileşen sınıfında genel C# özellikleri ile [Parameter] niteliği kullanılarak tanımlanır.

Aşağıdaki ParameterChild bileşeninde bileşen parametreleri şunlardır:

  • Yerleşik başvuru türleri.

  • Kullanıcı tanımlı bir referans türü (PanelBody), bir Bootstrap kart gövdesini Body içerisine geçirmek için kullanılır.

    PanelBody.cs:

    namespace BlazorSample;
    
    public class PanelBody
    {
        public string? Text { get; set; }
        public string? Style { get; set; }
    }
    
    namespace BlazorSample;
    
    public class PanelBody
    {
        public string? Text { get; set; }
        public string? Style { get; set; }
    }
    
    public class PanelBody
    {
        public string? Text { get; set; }
        public string? Style { get; set; }
    }
    
    public class PanelBody
    {
        public string? Text { get; set; }
        public string? Style { get; set; }
    }
    
    public class PanelBody
    {
        public string Text { get; set; }
        public string Style { get; set; }
    }
    
    public class PanelBody
    {
        public string Text { get; set; }
        public string Style { get; set; }
    }
    

ParameterChild.razor:

<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">@Title</div>
    <div class="card-body" style="font-style:@Body.Style">
        <p>@Body.Text</p>
        @if (Count is not null)
        {
            <p>The count is @Count.</p>
        }
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; } = "Set By Child";

    [Parameter]
    public PanelBody Body { get; set; } =
        new()
        {
            Text = "Card content set by child.",
            Style = "normal"
        };

    [Parameter]
    public int? Count { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">@Title</div>
    <div class="card-body" style="font-style:@Body.Style">
        <p>@Body.Text</p>
        @if (Count is not null)
        {
            <p>The count is @Count.</p>
        }
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; } = "Set By Child";

    [Parameter]
    public PanelBody Body { get; set; } =
        new()
        {
            Text = "Card content set by child.",
            Style = "normal"
        };
    
    [Parameter]
    public int? Count { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">@Title</div>
    <div class="card-body" style="font-style:@Body.Style">
        <p>@Body.Text</p>
        @if (Count is not null)
        {
            <p>The count is @Count.</p>
        }
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; } = "Set By Child";

    [Parameter]
    public PanelBody Body { get; set; } =
        new()
        {
            Text = "Set by child.",
            Style = "normal"
        };

    [Parameter]
    public int? Count { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">@Title</div>
    <div class="card-body" style="font-style:@Body.Style">
        <p>@Body.Text</p>
        @if (Count is not null)
        {
            <p>The count is @Count.</p>
        }
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; } = "Set By Child";

    [Parameter]
    public PanelBody Body { get; set; } =
        new()
        {
            Text = "Set by child.",
            Style = "normal"
        };

    [Parameter]
    public int? Count { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">@Title</div>
    <div class="card-body" style="font-style:@Body.Style">
        <p>@Body.Text</p>
        @if (Count is not null)
        {
            <p>The count is @Count.</p>
        }
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; } = "Set By Child";

    [Parameter]
    public PanelBody Body { get; set; } =
        new()
        {
            Text = "Set by child.",
            Style = "normal"
        };

    [Parameter]
    public int? Count { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">@Title</div>
    <div class="card-body" style="font-style:@Body.Style">
        <p>@Body.Text</p>
        @if (Count is not null)
        {
            <p>The count is @Count.</p>
        }
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; } = "Set By Child";

    [Parameter]
    public PanelBody Body { get; set; } =
        new PanelBody()
        {
            Text = "Set by child.",
            Style = "normal"
        };

    [Parameter]
    public int? Count { get; set; }
}

Uyarı

Bileşen parametreleri ilk değerlerinin sağlanması desteklenir ama bileşen ilk kez işlendikten sonra kendi parametrelerine yazan bir bileşen oluşturmayın. Daha fazla bilgi için bkz . ASP.NET Core'da Blazorparametrelerin üzerine yazmaktan kaçının.

ParameterChild bileşeninin bileşen parametreleri, ParameterChild bileşeninin bir örneğini işleyen HTML etiketindeki bağımsız değişkenler tarafından ayarlanabilir. Aşağıdaki ebeveyn bileşen iki ParameterChild bileşenini render eder:

  • İlk ParameterChild bileşen, parametre argümanları sağlanmadan işlenir.
  • İkinci ParameterChild bileşeni, Titleözelliklerinin değerlerini ayarlamak için Body kullanan üst bileşenden ve PanelBody değerlerini alır.

Parameter1.razor:

@page "/parameter-1"

<PageTitle>Parameter 1</PageTitle>

<h1>Parameter Example 1</h1>

<h1>Child component (without attribute values)</h1>

<ParameterChild />

<h1>Child component (with attribute values)</h1>

<ParameterChild Title="Set by Parent" 
    Body="@(new PanelBody() { Text = "Set by parent.", Style = "italic" })" />

Parameter1.razor:

@page "/parameter-1"

<PageTitle>Parameter 1</PageTitle>

<h1>Parameter Example 1</h1>

<h1>Child component (without attribute values)</h1>

<ParameterChild />

<h1>Child component (with attribute values)</h1>

<ParameterChild Title="Set by Parent" 
    Body="@(new PanelBody() { Text = "Set by parent.", Style = "italic" })" />

ParameterParent.razor:

@page "/parameter-parent"

<h1>Child component (without attribute values)</h1>

<ParameterChild />

<h1>Child component (with attribute values)</h1>

<ParameterChild Title="Set by Parent"
                Body="@(new PanelBody() { Text = "Set by parent.", Style = "italic" })" />

ParameterParent.razor:

@page "/parameter-parent"

<h1>Child component (without attribute values)</h1>

<ParameterChild />

<h1>Child component (with attribute values)</h1>

<ParameterChild Title="Set by Parent"
                Body="@(new PanelBody() { Text = "Set by parent.", Style = "italic" })" />

ParameterParent.razor:

@page "/parameter-parent"

<h1>Child component (without attribute values)</h1>

<ParameterChild />

<h1>Child component (with attribute values)</h1>

<ParameterChild Title="Set by Parent"
                Body="@(new PanelBody() { Text = "Set by parent.", Style = "italic" })" />

ParameterParent.razor:

@page "/parameter-parent"

<h1>Child component (without attribute values)</h1>

<ParameterChild />

<h1>Child component (with attribute values)</h1>

<ParameterChild Title="Set by Parent"
                Body="@(new PanelBody() { Text = "Set by parent.", Style = "italic" })" />

Üst bileşenden aşağıdaki işlenmiş HTML işaretlemesi, üst bileşen bileşen parametre değerlerini sağlamadığında ParameterChild bileşen varsayılan değerlerini gösterir. Üst bileşen bileşen parametre değerleri sağladığında, ParameterChild bileşenin varsayılan değerlerini değiştirir.

Not

Netlik sağlamak için, işlenen CSS stil sınıflarının çoğu ve bazı öğeler aşağıdaki işlenmiş HTML işaretlemesinde gösterilmez. Aşağıdaki örnekte ortaya konan ana kavram, üst bileşenin bileşen parametrelerini kullanarak alt bileşene değerler atamasıdır.

<h1>Child component (without attribute values)</h1>

<div>Set By Child</div>
<div style="font-style:normal">
    <p>Card content set by child.</p>
</div>

<h1>Child component (with attribute values)</h1>

<div>Set by Parent</div>
<div style="font-style:italic">
    <p>Set by parent.</p>
</div>

Bir bileşen parametresine BIR C# alanı, özelliği veya bir yöntemin sonucunu HTML öznitelik değeri olarak atayın. özniteliğinin değeri genellikle parametresinin türüyle eşleşen herhangi bir C# ifadesi olabilir. Özniteliğin değeri, opsiyonel olarak Razor ayrılmış @ bir simgeyle başlayabilir, ancak gerekli değildir.

Bileşen parametresi dize türündeyse, öznitelik değeri bunun yerine C# dize değişmez değeri olarak değerlendirilir. Bunun yerine bir C# ifadesi belirtmek istiyorsanız ön ekini @ kullanın.

Aşağıdaki üst bileşen, önceki ParameterChild bileşeninin dört örneğini görüntüler ve Title parametre değerlerini olarak ayarlar:

  • title alanının değeri.
  • GetTitle C# yönteminin sonucu.
  • ToLongDateString kullanan gömülü C# ifadesi ile uzun biçimde geçerli yerel tarih.
  • panelData nesnesinin Title özelliği.

Beşinci ParameterChild bileşen örneği de Count parametresini ayarlar. Dikkat edin, stringtüründe bir parametre, bir ifadenin yanlışlıkla metin sabiti olarak değerlendirilmemesi için @ ön ekine ihtiyaç duyar. Ancak, Count null atanabilir bir tamsayıdır (System.Int32), bu nedenle Count, count değerini @ ön eki olmadan alır. Kuruluşunuzdaki geliştiricilerin her zaman @ön ekini eklemesini gerektiren alternatif bir kod kuralı oluşturabilirsiniz. Her iki durumda da, bileşen parametrelerinin Razor işaretlemede nasıl geçirildiğini gösteren tutarlı bir yaklaşım benimsemenizi öneririz.

HTML5 belirtimine göre, parametre öznitelik değerlerinin etrafındaki tırnak işaretleri çoğu durumda isteğe bağlıdır. Örneğin Value=this yerine Value="this" desteklenir. Bununla birlikte anımsaması daha kolay olduğu ve web tabanlı teknolojilerde yaygın olarak benimsendiği için tırnak işaretleri kullanılmasını öneririz.

Belgeler genelinde kod örnekleri:

  • Her zaman tırnak işaretleri kullanın. Örnek: Value="this".
  • Gerekmedikçe @ ön ekini harf olmayan ifadelerle kullanmayın. Örnek: Count="count", burada count sayı türünde bir değişkendir. Count="@count" geçerli bir stil yaklaşımıdır, ancak belgeler ve örnekler kuralı benimsemez.
  • Literals dışında @, Razor ifadelerinde her zaman kaçının. Örnek: IsFixed="true". Buna anahtar sözcükler (örneğin, this) ve nulldahildir, ancak isterseniz bunları kullanmayı seçebilirsiniz. Örneğin IsFixed="@true" kullanımına sık rastlanmaz ama desteklenir.

Parameter2.razor:

@page "/parameter-2"

<PageTitle>Parameter 2</PageTitle>

<h1>Parameter Example 2</h1>

<ParameterChild Title="@title" />

<ParameterChild Title="@GetTitle()" />

<ParameterChild Title="@DateTime.Now.ToLongDateString()" />

<ParameterChild Title="@panelData.Title" />

<ParameterChild Title="String literal title" Count="count" />

@code {
    private string title = "From Parent field";
    private PanelData panelData = new();
    private int count = 12345;

    private string GetTitle() => "From Parent method";

    private class PanelData
    {
        public string Title { get; set; } = "From Parent object";
    }
}

Parameter2.razor:

@page "/parameter-2"

<PageTitle>Parameter 2</PageTitle>

<h1>Parameter Example 2</h1>

<ParameterChild Title="@title" />

<ParameterChild Title="@GetTitle()" />

<ParameterChild Title="@DateTime.Now.ToLongDateString()" />

<ParameterChild Title="@panelData.Title" />

<ParameterChild Title="String literal title" Count="count" />

@code {
    private string title = "From Parent field";
    private PanelData panelData = new();
    private int count = 12345;

    private string GetTitle() => "From Parent method";

    private class PanelData
    {
        public string Title { get; set; } = "From Parent object";
    }
}

ParameterParent2.razor:

@page "/parameter-parent-2"

<ParameterChild Title="@title" />

<ParameterChild Title="@GetTitle()" />

<ParameterChild Title="@DateTime.Now.ToLongDateString()" />

<ParameterChild Title="@panelData.Title" />

<ParameterChild Title="String literal title" Count="count" />

@code {
    private string title = "From Parent field";
    private PanelData panelData = new();
    private int count = 12345;

    private string GetTitle()
    {
        return "From Parent method";
    }

    private class PanelData
    {
        public string Title { get; set; } = "From Parent object";
    }
}

ParameterParent2.razor:

@page "/parameter-parent-2"

<ParameterChild Title="@title" />

<ParameterChild Title="@GetTitle()" />

<ParameterChild Title="@DateTime.Now.ToLongDateString()" />

<ParameterChild Title="@panelData.Title" />

<ParameterChild Title="String literal title" Count="count" />

@code {
    private string title = "From Parent field";
    private PanelData panelData = new();
    private int count = 12345;

    private string GetTitle()
    {
        return "From Parent method";
    }

    private class PanelData
    {
        public string Title { get; set; } = "From Parent object";
    }
}

ParameterParent2.razor:

@page "/parameter-parent-2"

<ParameterChild Title="@title" />

<ParameterChild Title="@GetTitle()" />

<ParameterChild Title="@DateTime.Now.ToLongDateString()" />

<ParameterChild Title="@panelData.Title" />

<ParameterChild Title="String literal title" Count="count" />

@code {
    private string title = "From Parent field";
    private PanelData panelData = new PanelData();
    private int count = 12345;

    private string GetTitle()
    {
        return "From Parent method";
    }

    private class PanelData
    {
        public string Title { get; set; } = "From Parent object";
    }
}

Not

C# üyesini bir bileşen parametresine atarken, parametrenin HTML özniteliğine @ öneki eklemeyin.

Correct (Title bir dize parametresidir, Count sayı türünde bir parametredir):

<ParameterChild Title="@title" Count="count" />
<ParameterChild Title="@title" Count="@count" />

Yanlış:

<ParameterChild @Title="@title" @Count="count" />
<ParameterChild @Title="@title" @Count="@count" />

Razor sayfalarından (.cshtml) farklı olarak, Blazor bir bileşeni işlerken Razor ifadesinde zaman uyumsuz çalışma yapamaz. Bunun nedeni Blazor'ın etkileşimli kullanıcı arabirimlerini işlemek için tasarlanmış olmasıdır. Etkileşimli kullanıcı arabiriminde ekranda her zaman bir şey görüntülenmesi gerekir, dolayısıyla işleme akışını engellemek mantıklı değildir. Bunun yerine, zaman uyumsuz çalışma zaman uyumsuz yaşam döngüsü olaylarından biri sırasında gerçekleştirilir. Her bir eşzamansız yaşam döngüsü olayından sonra, bileşen yeniden oluşturulabilir. Aşağıdaki Razor söz dizimi desteklenmez:

<ParameterChild Title="await ..." />
<ParameterChild Title="@await ..." />

Yukarıdaki örnekte verilen kod, uygulama derlenirken bir derleyici hatası oluşturur:

'await' operatörü yalnızca bir asenkron yöntemin içinde kullanılabilir. Bu yöntemi 'async' değiştiricisiyle işaretlemeyi ve dönüş türünü 'Task' olarak değiştirmeyi göz önünde bulundurun.

Önceki örnekte zaman uyumsuz olarak Title parametresinin değerini almak için bileşen OnInitializedAsync yaşam döngüsü olayını kullanabilir. Aşağıdaki örnekte bu gösterilir:

<ParameterChild Title="@title" />

@code {
    private string? title;
    
    protected override async Task OnInitializedAsync()
    {
        title = await ...;
    }
}

Daha fazla bilgi için bkz. ASP.NET Core Razor bileşeni yaşam döngüsü.

Bir parametreye atama için metni bir ifade sonucuyla birleştirmek üzere açık bir Razor ifadesinin kullanılması desteklenmez. Aşağıdaki örnek "Set by " metnini bir nesnenin özellik değeriyle birleştirmeyi amaçlar. Bu söz dizimi bir Razor sayfasında desteklense de (.cshtml), bir bileşendeki alt öğenin Title parametresine atama için uygun değildir. Aşağıdaki Razor söz dizimi desteklenmez:

<ParameterChild Title="Set by @(panelData.Title)" />

Yukarıdaki örnekte verilen kod, uygulama derlenirken bir derleyici hatası oluşturur:

Bileşen öznitelikleri karmaşık içeriği (karma C# ve işaretleme) desteklemez.

Oluşturulan değerin atamasını desteklemek için bir yöntem, alan veya özellik kullanın. Aşağıdaki örnek Set by C# yönteminde "GetTitle" ile bir nesnenin özellik değerini birleştirir:

Parameter3.razor:

@page "/parameter-3"

<PageTitle>Parameter 3</PageTitle>

<h1>Parameter Example 3</h1>

<ParameterChild Title="@GetTitle()" />

@code {
    private PanelData panelData = new();

    private string GetTitle() => $"Set by {panelData.Title}";

    private class PanelData
    {
        public string Title { get; set; } = "Parent";
    }
}

Parameter3.razor:

@page "/parameter-3"

<PageTitle>Parameter 3</PageTitle>

<h1>Parameter Example 3</h1>

<ParameterChild Title="@GetTitle()" />

@code {
    private PanelData panelData = new();

    private string GetTitle() => $"Set by {panelData.Title}";

    private class PanelData
    {
        public string Title { get; set; } = "Parent";
    }
}

ParameterParent3.razor:

@page "/parameter-parent-3"

<ParameterChild Title="@GetTitle()" />

@code {
    private PanelData panelData = new();

    private string GetTitle() => $"Set by {panelData.Title}";

    private class PanelData
    {
        public string Title { get; set; } = "Parent";
    }
}

ParameterParent3.razor:

@page "/parameter-parent-3"

<ParameterChild Title="@GetTitle()" />

@code {
    private PanelData panelData = new();

    private string GetTitle() => $"Set by {panelData.Title}";

    private class PanelData
    {
        public string Title { get; set; } = "Parent";
    }
}

ParameterParent3.razor:

@page "/parameter-parent-3"

<ParameterChild Title="@GetTitle()" />

@code {
    private PanelData panelData = new();

    private string GetTitle() => $"Set by {panelData.Title}";

    private class PanelData
    {
        public string Title { get; set; } = "Parent";
    }
}

ParameterParent3.razor:

@page "/parameter-parent-3"

<ParameterChild Title="@GetTitle()" />

@code {
    private PanelData panelData = new PanelData();

    private string GetTitle() => $"Set by {panelData.Title}";

    private class PanelData
    {
        public string Title { get; set; } = "Parent";
    }
}

Daha fazla bilgi için bkz. ASP.NET Core için Razor söz dizimi başvurusu.

Uyarı

Bileşen parametreleri ilk değerlerinin sağlanması desteklenir ama bileşen ilk kez işlendikten sonra kendi parametrelerine yazan bir bileşen oluşturmayın. Daha fazla bilgi için bkz . ASP.NET Core'da Blazorparametrelerin üzerine yazmaktan kaçının.

Bileşen parametreleri otomatik özellikler olarak bildirilmelidir; diğer bir deyişle get veya set erişimcilerinde özel mantık içermemesi gerekir. Örneğin aşağıdaki StartData özelliği bir otomatik özelliktir:

[Parameter]
public DateTime StartData { get; set; }

Bileşen parametrelerinin tek amacı üst bileşenden alt bileşene bilgi akışı için bir kanal olarak kullanılmak olduğundan, get veya set erişimcisine özel mantık yerleştirmeyin. Alt bileşen özelliğinin set erişimcisi üst bileşenin yeniden işlenmesine neden olan bir mantık içerirse, bu durum sonsuz bir işleme döngüsüyle sonuçlanır.

Alınan parametre değerini dönüştürmek için:

  • Parametre özelliğini, sağlanan ham verileri temsil edecek bir otomatik özellik olarak bırakın.
  • Parametre özelliğine göre dönüştürülen verileri sağlamak için farklı bir özellik veya yöntem oluşturun.

Her yeni veri alındığında, alınan parametreyi dönüştürmek için OnParametersSetAsync yöntemini geçersiz kılın.

Bileşen parametresine ilk değeri yazmak desteklenir çünkü ilk değer atamaları Blazor'ın otomatik bileşen işlemesini engellemez. Bir bileşende, DateTime öğesinin DateTime.Now ile StartData öğesine yapılan ataması geçerli bir söz dizimidir.

[Parameter]
public DateTime StartData { get; set; } = DateTime.Now;

İlk DateTime.Now atamasından sonra, geliştirici kodunda StartData için değer ataması yapılmamalıdır. Daha fazla bilgi için bkz . ASP.NET Core'da Blazorparametrelerin üzerine yazmaktan kaçının.

Gerekli bileşen parametresini sağlamak için [EditorRequired] özniteliğini uygulayın. Parametre değeri sağlanmazsa, düzenleyiciler veya derleme araçları kullanıcıya uyarılar görüntüleyebilir. Bu öznitelik yalnızca [Parameter] özniteliğiyle de işaretlenmiş olan özelliklerde geçerlidir. EditorRequiredAttribute tasarım zamanında veya uygulama derlendiğinde zorunlu tutulur. Öznitelik çalışma zamanında zorunlu tutulmaz ve null olmayan bir parametre değerini garanti etmez.

[Parameter]
[EditorRequired]
public string? Title { get; set; }

Tek satırlı öznitelik listeleri de desteklenir:

[Parameter, EditorRequired]
public string? Title { get; set; }

Bileşen parametresi özelliklerinde değiştiriciyi veyarequirederişimciyi init kullanmayın. Bileşenler genellikle yansıma kullanılarak örneklenir ve parametre değerleri atanır; bu yöntem, init ve required garantilerini gerçekleştirmek üzere tasarlanmışken, bu garantileri geçersiz kılar. Bunun yerine gerekli bileşen parametresini [EditorRequired] belirtmek için özniteliğini kullanın.

Bileşen parametre değerlerini ayarlamak için yansımainit kullandığından, yalnızca init ayarlayıcı kısıtlamasını atladığı için bileşen parametresi özellikleri üzerinde erişimciyi kullanmayınParameterView.SetParameterProperties. [EditorRequired] Gerekli bir bileşen parametresini belirtmek için özniteliğini kullanın.

Bileşen parametresi özelliklerinde erişimciyi kullanmayın çünkü ParameterView.SetParameterPropertiesyansıma kullanarak bileşen parametresi değerlerini ayarlamak, yalnızca başlatıcı ayarlayıcı kısıtlamasını atlar.

Tuples (API belgeleri), bileşen parametreleri ve RenderFragment türleri için desteklenir. Aşağıdaki bileşen parametresi örneği Tuple içinde üç değer geçirir:

RenderTupleChild.razor:

<div class="card w-50" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Tuple Card</div>
    <div class="card-body">
        <ul>
            <li>Integer: @Data?.Item1</li>
            <li>String: @Data?.Item2</li>
            <li>Boolean: @Data?.Item3</li>
        </ul>
    </div>
</div>

@code {
    [Parameter]
    public (int, string, bool)? Data { get; set; }
}

RenderTupleParent.razor:

@page "/render-tuple-parent"

<PageTitle>Render Tuple Parent</PageTitle>

<h1>Render Tuple Parent Example</h1>

<RenderTupleChild Data="data" />

@code {
    private (int, string, bool) data = new(999, "I aim to misbehave.", true);
}

Adlandırılmış tanımlama kümeleri , aşağıdaki örnekte görüldüğü gibi desteklenir:

NamedTupleChild.razor:

<div class="card w-50" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Tuple Card</div>
    <div class="card-body">
        <ul>
            <li>Integer: @Data?.TheInteger</li>
            <li>String: @Data?.TheString</li>
            <li>Boolean: @Data?.TheBoolean</li>
        </ul>
    </div>
</div>

@code {
    [Parameter]
    public (int TheInteger, string TheString, bool TheBoolean)? Data { get; set; }
}

NamedTuples.razor:

@page "/named-tuples"

<PageTitle>Named Tuples</PageTitle>

<h1>Named Tuples Example</h1>

<NamedTupleChild Data="data" />

@code {
    private (int TheInteger, string TheString, bool TheBoolean) data = 
        new(999, "I aim to misbehave.", true);
}

Alıntı ©2005 Universal Pictures: Serenity (Nathan Fillion)

Tuples (API belgeleri), bileşen parametreleri ve RenderFragment türleri için desteklenir. Aşağıdaki bileşen parametresi örneği Tuple içinde üç değer geçirir:

RenderTupleChild.razor:

<div class="card w-50" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Tuple Card</div>
    <div class="card-body">
        <ul>
            <li>Integer: @Data?.Item1</li>
            <li>String: @Data?.Item2</li>
            <li>Boolean: @Data?.Item3</li>
        </ul>
    </div>
</div>

@code {
    [Parameter]
    public (int, string, bool)? Data { get; set; }
}

RenderTupleParent.razor:

@page "/render-tuple-parent"

<PageTitle>Render Tuple Parent</PageTitle>

<h1>Render Tuple Parent Example</h1>

<RenderTupleChild Data="data" />

@code {
    private (int, string, bool) data = new(999, "I aim to misbehave.", true);
}

Adlandırılmış tanımlama kümeleri , aşağıdaki örnekte görüldüğü gibi desteklenir:

NamedTupleChild.razor:

<div class="card w-50" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Tuple Card</div>
    <div class="card-body">
        <ul>
            <li>Integer: @Data?.TheInteger</li>
            <li>String: @Data?.TheString</li>
            <li>Boolean: @Data?.TheBoolean</li>
        </ul>
    </div>
</div>

@code {
    [Parameter]
    public (int TheInteger, string TheString, bool TheBoolean)? Data { get; set; }
}

NamedTuples.razor:

@page "/named-tuples"

<PageTitle>Named Tuples</PageTitle>

<h1>Named Tuples Example</h1>

<NamedTupleChild Data="data" />

@code {
    private (int TheInteger, string TheString, bool TheBoolean) data = 
        new(999, "I aim to misbehave.", true);
}

Alıntı ©2005 Universal Pictures: Serenity (Nathan Fillion)

Tuples (API belgeleri), bileşen parametreleri ve RenderFragment türleri için desteklenir. Aşağıdaki bileşen parametresi örneği Tuple içinde üç değer geçirir:

RenderTupleChild.razor:

<div class="card w-50" style="margin-bottom:15px">
    <div class="card-header font-weight-bold"><code>Tuple</code> Card</div>
    <div class="card-body">
        <ul>
            <li>Integer: @Data?.Item1</li>
            <li>String: @Data?.Item2</li>
            <li>Boolean: @Data?.Item3</li>
        </ul>
    </div>
</div>

@code {
    [Parameter]
    public (int, string, bool)? Data { get; set; }
}

RenderTupleParent.razor:

@page "/render-tuple-parent"

<h1>Render Tuple Parent</h1>

<RenderTupleChild Data="data" />

@code {
    private (int, string, bool) data = new(999, "I aim to misbehave.", true);
}

Adlandırılmış tanımlama kümeleri , aşağıdaki örnekte görüldüğü gibi desteklenir:

RenderNamedTupleChild.razor:

<div class="card w-50" style="margin-bottom:15px">
    <div class="card-header font-weight-bold"><code>Tuple</code> Card</div>
    <div class="card-body">
        <ul>
            <li>Integer: @Data?.TheInteger</li>
            <li>String: @Data?.TheString</li>
            <li>Boolean: @Data?.TheBoolean</li>
        </ul>
    </div>
</div>

@code {
    [Parameter]
    public (int TheInteger, string TheString, bool TheBoolean)? Data { get; set; }
}

RenderNamedTupleParent.razor:

@page "/render-named-tuple-parent"

<h1>Render Named Tuple Parent</h1>

<RenderNamedTupleChild Data="data" />

@code {
    private (int TheInteger, string TheString, bool TheBoolean) data = 
        new(999, "I aim to misbehave.", true);
}

Alıntı ©2005 Universal Pictures: Serenity (Nathan Fillion)

Yönlendirme parametreleri

Bileşenler @page yönergesinin yönlendirme şablonunda yönlendirme parametreleri belirtebilir. Blazor yönlendiricisi ilgili bileşen parametrelerini doldurmak için yönlendirme parametrelerini kullanır.

RouteParameter1.razor:

@page "/route-parameter-1/{text}"

<PageTitle>Route Parameter 1</PageTitle>

<h1>Route Parameter Example 1</h1>

<p>Blazor is @Text!</p>

@code {
    [Parameter]
    public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"

<PageTitle>Route Parameter 1</PageTitle>

<h1>Route Parameter Example 1</h1>

<p>Blazor is @Text!</p>

@code {
    [Parameter]
    public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"

<h1>Blazor is @Text!</h1>

@code {
    [Parameter]
    public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"

<h1>Blazor is @Text!</h1>

@code {
    [Parameter]
    public string? Text { get; set; }
}
@page "/route-parameter-1/{text}"

<h1>Blazor is @Text!</h1>

@code {
    [Parameter]
    public string Text { get; set; }
}
@page "/route-parameter-1/{text}"

<h1>Blazor is @Text!</h1>

@code {
    [Parameter]
    public string Text { get; set; }
}

Daha fazla bilgi için ASP.NET Core yönlendirme ve gezintisinin BlazorYol parametreleri bölümüne bakın. İsteğe bağlı yol parametreleri de desteklenir ve aynı bölümde ele alınmıştır. Birden çok klasör sınırındaki yolları yakalayan tümünü yakala yol parametreleri ({*pageRoute} ) hakkında bilgi için, ASP.NET Core yönlendirme ve gezintisininBlazor Tümünü yakala yol parametreleri bölümüne bakın.

Daha fazla bilgi için ASP.NET Core yönlendirme ve gezintisinin BlazorYol parametreleri bölümüne bakın. İsteğe bağlı yol parametreleri desteklenmez, bu nedenle iki @page yönerge gerekir (daha fazla bilgi için Rota parametreleri bölümüne bakın). Birden çok klasör sınırındaki yolları yakalayan tümünü yakala yol parametreleri ({*pageRoute} ) hakkında bilgi için, ASP.NET Core yönlendirme ve gezintisininBlazor Tümünü yakala yol parametreleri bölümüne bakın.

Uyarı

Varsayılan olarak etkin olan sıkıştırma ile güvenilmeyen kaynaklardan veri işleyen güvenli (kimliği doğrulanmış/yetkilendirilmiş) etkileşimli sunucu tarafı bileşenleri oluşturmaktan kaçının. Güvenilmeyen kaynaklar arasında yol parametreleri, sorgu dizeleri, birlikte çalışma verileri JS ve üçüncü taraf bir kullanıcının denetleyebileceği diğer veri kaynakları (veritabanları, dış hizmetler) bulunur. Daha fazla bilgi için bkz . ASP.NET Core BlazorSignalR kılavuzu ve ASP.NET Core Blazor etkileşimli sunucu tarafı işleme için tehdit azaltma kılavuzu.

Çocuk içerik render parçaları

Bileşenler başka bir bileşenin içeriğini ayarlayabilir. İçerik atayan bileşen, alt bileşenin başlangıç ve bitiş etiketleri arasındaki içeriği sağlar.

Aşağıdaki örnekte RenderFragmentChild bileşeninde kullanıcı arabiriminin ChildContent olarak işlenecek bir segmentini temsil eden RenderFragment bileşen parametresi vardır. Bileşenin ChildContent işaretlemesinde Razor parametresinin konumu, son HTML çıkışında içeriğin işleneceği konumdur.

RenderFragmentChild.razor:

<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public RenderFragment ChildContent { get; set; }
}
<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public RenderFragment ChildContent { get; set; }
}

Önemli

RenderFragment içeriğini alan özellik, kurala göre ChildContent olarak adlandırılmalıdır.

Olay geri çağrılarıRenderFragment için desteklenmez.

Aşağıdaki bileşen, içeriği alt bileşenin açma ve kapatma etiketleri arasına yerleştirerek RenderFragmentChild öğesini işlemek için sağlar.

RenderFragments.razor:

@page "/render-fragments"

<PageTitle>Render Fragments</PageTitle>

<h1>Render Fragments Example</h1>

<RenderFragmentChild>
    Content of the child component is supplied
    by the parent component.
</RenderFragmentChild>

RenderFragments.razor:

@page "/render-fragments"

<PageTitle>Render Fragments</PageTitle>

<h1>Render Fragments Example</h1>

<RenderFragmentChild>
    Content of the child component is supplied
    by the parent component.
</RenderFragmentChild>

RenderFragmentParent.razor:

@page "/render-fragment-parent"

<h1>Render child content</h1>

<RenderFragmentChild>
    Content of the child component is supplied
    by the parent component.
</RenderFragmentChild>

RenderFragmentParent.razor:

@page "/render-fragment-parent"

<h1>Render child content</h1>

<RenderFragmentChild>
    Content of the child component is supplied
    by the parent component.
</RenderFragmentChild>

RenderFragmentParent.razor:

@page "/render-fragment-parent"

<h1>Render child content</h1>

<RenderFragmentChild>
    Content of the child component is supplied
    by the parent component.
</RenderFragmentChild>

RenderFragmentParent.razor:

@page "/render-fragment-parent"

<h1>Render child content</h1>

<RenderFragmentChild>
    Content of the child component is supplied
    by the parent component.
</RenderFragmentChild>

Çizim parçaları, Blazor uygulamalarında alt içeriği oluşturmak için kullanılır ve aşağıdaki makalelerde ve makale bölümlerinde örneklerle açıklanır.

Not

Blazor çerçevesinin yerleşik Razor bileşenleri içeriklerini ayarlamak için aynı ChildContent bileşen parametresi kuralını kullanır. API belgelerinde ("ChildContent" arama terimiyle API'yi filtreleyerek)ChildContent bileşen parametresi özellik adını arayarak alt içeriği ayarlayan bileşenleri görebilirsiniz.

Parçaları, yeniden kullanılabilir işleme mantığı ile işleyin

Alt bileşenleri yalnızca işleme mantığını yeniden kullanmanın bir yolu olarak değerlendirebilirsiniz. Herhangi bir bileşenin @code bloğunda bir RenderFragment tanımlayın ve parçayı herhangi bir konumdan gerektiği kadar işleyin:

@RenderWelcomeInfo

<p>Render the welcome info a second time:</p>

@RenderWelcomeInfo

@code {
    private RenderFragment RenderWelcomeInfo =  @<p>Welcome to your new app!</p>;
}

Daha fazla bilgi için bkz. İşleme mantığını yeniden kullanma.

Değişkenleri bileşen parametreleri ve alt içerikler ile döngüde kullanma

for döngüsü içindeki bileşenlerin işlenmesi, eğer arttırılan döngü değişkeni bileşenin parametreleri veya RenderFragment alt içeriği tarafından kullanılıyorsa, yerel bir dizin değişkeni gerektirir.

Aşağıdaki RenderFragmentChild2 bileşeni, hem bir bileşen parametresine (Id) hem de alt içeriği görüntülemek için bir işleme parçasına (ChildContent) sahiptir.

RenderFragmentChild2.razor:

<div class="card w-25" style="margin-bottom:15px">
    <div class="card-header font-weight-bold">Child content (@Id)</div>
    <div class="card-body">@ChildContent</div>
</div>

@code {
    [Parameter]
    public string? Id { get; set; }

    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}

Bileşen RenderFragmentChild2 bir üst bileşende işlerken, bileşen parametre değerini atarken ve alt bileşenin içeriğini sağlarken döngü değişkeni (c) yerine yerel bir dizin değişkeni (ct aşağıdaki örnekte) kullanın.

@for (int c = 1; c < 4; c++)
{
    var ct = c;

    <RenderFragmentChild2 Id="@($"Child{ct}")">
        Count: @ct
    </RenderFragmentChild2>
}

Alternatif olarak, foreach döngüsü yerine for döngüsü ile Enumerable.Range kullanın:

@foreach (var c in Enumerable.Range(1, 3))
{
    <RenderFragmentChild2 Id="@($"Child{c}")">
        Count: @c
    </RenderFragmentChild2>
}

Bileşenlere yönelik referansları yakalama

Bileşen referansları, bir bileşen örneğine komut göndermek için bir yol sağlar. Bir bileşen referansını elde etmek için:

  • Alt bileşene bir @ref özniteliği ekleyin.
  • Çocuk bileşen ile aynı türde bir alan tanımlayın.

Bileşen işlendiğinde, alan bileşen örneğiyle doldurulur. Ardından örnekte .NET yöntemlerini çağırabilirsiniz.

Aşağıdaki ReferenceChild bileşenini inceleyin, bu bileşen ChildMethod çağrıldığında günlüğe bir mesaj kaydeder.

ReferenceChild.razor:

@inject ILogger<ReferenceChild> Logger

@if (value > 0)
{
    <p>
        <code>value</code>: @value
    </p>
}

@code {
    private int value;

    public void ChildMethod(int value)
    {
        Logger.LogInformation("Received {Value} in ChildMethod", value);

        this.value = value;
        StateHasChanged();
    }
}
@inject ILogger<ReferenceChild> Logger

@if (value > 0)
{
    <p>
        <code>value</code>: @value
    </p>
}

@code {
    private int value;

    public void ChildMethod(int value)
    {
        Logger.LogInformation("Received {Value} in ChildMethod", value);

        this.value = value;
        StateHasChanged();
    }
}
@using Microsoft.Extensions.Logging
@inject ILogger<ReferenceChild> Logger

@code {
    public void ChildMethod(int value)
    {
        Logger.LogInformation("Received {Value} in ChildMethod", value);
    }
}
@using Microsoft.Extensions.Logging
@inject ILogger<ReferenceChild> Logger

@code {
    public void ChildMethod(int value)
    {
        Logger.LogInformation("Received {Value} in ChildMethod", value);
    }
}
@using Microsoft.Extensions.Logging
@inject ILogger<ReferenceChild> Logger

@code {
    public void ChildMethod(int value)
    {
        Logger.LogInformation("Received {Value} in ChildMethod", value);
    }
}
@using Microsoft.Extensions.Logging
@inject ILogger<ReferenceChild> Logger

@code {
    public void ChildMethod(int value)
    {
        Logger.LogInformation("Received {Value} in ChildMethod", value);
    }
}

Bileşen referansı, yalnızca bileşen işlendikten ve çıktısı ReferenceChild öğesini içerdiğinde doldurulur. Bileşen işlenene kadar başvurulacak bir şey yoktur. Başvuru değişkeni tıklama olayının atandığı sırada atanmayabileceği için bir bileşen yöntemini doğrudan olay işleyicisine çağırmayı denemeyin (örneğin, @onclick="childComponent!.ChildMethod(5)").

Bileşenin işlenmesi tamamlandıktan sona bileşen başvurularını denetlemek için OnAfterRender veya OnAfterRenderAsync yöntemlerini kullanın.

Aşağıdaki örnek, önceki ReferenceChild bileşeni kullanır.

ReferenceParent.razor:

@page "/reference-parent"

<div>
    <button @onclick="@(() => childComponent1!.ChildMethod(5))">
        Call <code>ReferenceChild.ChildMethod</code> (first instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent1" />
</div>

<div>
    <button @onclick="CallChildMethod">
        Call <code>ReferenceChild.ChildMethod</code> (second instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent2" />
</div>

@code {
    private ReferenceChild? childComponent1;
    private ReferenceChild? childComponent2;

    private void CallChildMethod() => childComponent2!.ChildMethod(5);
}
@page "/reference-parent"

<div>
    <button @onclick="@(() => childComponent1!.ChildMethod(5))">
        Call <code>ReferenceChild.ChildMethod</code> (first instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent1" />
</div>

<div>
    <button @onclick="CallChildMethod">
        Call <code>ReferenceChild.ChildMethod</code> (second instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent2" />
</div>

@code {
    private ReferenceChild? childComponent1;
    private ReferenceChild? childComponent2;

    private void CallChildMethod() => childComponent2!.ChildMethod(5);
}
@page "/reference-parent"

<div>
    <button @onclick="@(() => childComponent1!.ChildMethod(5))">
        Call <code>ReferenceChild.ChildMethod</code> (first instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent1" />
</div>

<div>
    <button @onclick="CallChildMethod">
        Call <code>ReferenceChild.ChildMethod</code> (second instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent2" />
</div>

@code {
    private ReferenceChild? childComponent1;
    private ReferenceChild? childComponent2;

    private void CallChildMethod()
    {
        childComponent2!.ChildMethod(5);
    }
}
@page "/reference-parent"

<div>
    <button @onclick="@(() => childComponent1!.ChildMethod(5))">
        Call <code>ReferenceChild.ChildMethod</code> (first instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent1" />
</div>

<div>
    <button @onclick="CallChildMethod">
        Call <code>ReferenceChild.ChildMethod</code> (second instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent2" />
</div>

@code {
    private ReferenceChild? childComponent1;
    private ReferenceChild? childComponent2;

    private void CallChildMethod()
    {
        childComponent2!.ChildMethod(5);
    }
}
@page "/reference-parent"

<div>
    <button @onclick="@(() => childComponent1!.ChildMethod(5))">
        Call <code>ReferenceChild.ChildMethod</code> (first instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent1" />
</div>

<div>
    <button @onclick="CallChildMethod">
        Call <code>ReferenceChild.ChildMethod</code> (second instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent2" />
</div>

@code {
    private ReferenceChild childComponent1;
    private ReferenceChild childComponent2;

    private void CallChildMethod()
    {
        childComponent2!.ChildMethod(5);
    }
}
@page "/reference-parent"

<div>
    <button @onclick="@(() => childComponent1!.ChildMethod(5))">
        Call <code>ReferenceChild.ChildMethod</code> (first instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent1" />
</div>

<div>
    <button @onclick="CallChildMethod">
        Call <code>ReferenceChild.ChildMethod</code> (second instance) 
        with an argument of 5
    </button>

    <ReferenceChild @ref="childComponent2" />
</div>

@code {
    private ReferenceChild childComponent1;
    private ReferenceChild childComponent2;

    private void CallChildMethod()
    {
        childComponent2!.ChildMethod(5);
    }
}

Bileşen başvurularını yakalarken öğe başvurularını yakalama işlemine benzer bir söz dizimi kullanın; bileşen başvurularını yakalama bir JavaScript birlikte çalışma özelliği değildir. JavaScript koduna bileşen başvuruları aktarılmaz. Bileşen başvuruları yalnızca .NET kodunda kullanılır.

Önemli

Çocuk bileşenlerin durumunu değiştirmek için bileşen referanslarını kullanmaktan kaçının. Bunun yerine alt bileşenlere veri geçirirken normal bildirim temelli bileşen parametrelerini kullanın. Bileşen parametrelerinin kullanılması alt bileşenlerin doğru zamanlarda otomatik olarak yeniden işlenmesine neden olur. Daha fazla bilgi için bileşen parametreleri bölümüne ve ASP.NET Core Blazor veri bağlaması makalesine bakın.

Özniteliği uygulayın

Öznitelikler bileşenlere @attribute yönergesiyle uygulanabilir. Aşağıdaki örnek bileşenin sınıfına [Authorize] özniteliğini uygular:

@page "/"
@attribute [Authorize]

Koşullu HTML öğesi öznitelikleri ve DOM özellikleri

Blazor aşağıdaki genel davranışları benimser:

  • HTML öznitelikleri için özniteliği Blazor .NET değerine göre koşullu olarak ayarlar veya kaldırır. .NET değeri false veya null ise, öznitelik ayarlanmaz veya daha önce ayarlanmışsa kaldırılır.
  • veya checkedvalue gibi Blazor DOM özellikleri için DOM özelliğini .NET değerine göre ayarlar. .NET değeri false veya null ise, DOM özelliği varsayılan bir değere sıfırlanır.

Hangi Razor söz dizimi öznitelikleri HTML özniteliklerine karşılık gelir ve DOM özelliklerine karşılık gelenler belgelenmemiş kalır çünkü bu, bildirimde bulunmaksızın değişebilecek bir çerçeve uygulama ayrıntısıdır.

Uyarı

gibi aria-pressedbazı HTML özniteliklerinin "true" veya "false" dize değerine sahip olması gerekir. Dize değeri yerine boole değeri gerektirdiğinden, değerleri için string kullanmanız ve bool kullanmamanız gerekir. Bu, tarayıcı DOM API'leri tarafından ayarlanan bir gereksinimdir.

Ham HTML

Dizeler normalde DOM metin düğümleri kullanılarak işlenir ve bu, içerebilecekleri herhangi bir işaretlemenin yoksayıldığı ve değişmez metin olarak kabul edildiği anlamına gelir. Ham HTML'yi işlemek için HTML içeriğini bir MarkupString değerinde sarmalayın. Değer HTML veya SVG olarak ayrıştırılır ve DOM'a eklenir.

Uyarı

Güvenilmeyen bir kaynaktan oluşturulan ham HTML'nin işlenmesi bir güvenlik riskidir ve her zaman bundan kaçınılmalıdır.

Aşağıdaki örnekte bir bileşenin işlenen çıkışına statik HTML içeriği bloğu eklemek için MarkupString türünün kullanılması gösterilir.

MarkupStrings.razor:

@page "/markup-strings"

<PageTitle>Markup Strings</PageTitle>

<h1>Markup Strings Example</h1>

@((MarkupString)myMarkup)

@code {
    private string myMarkup =
        "<p class=\"text-danger\">This is a dangerous <em>markup string</em>.</p>";
}

MarkupStrings.razor:

@page "/markup-strings"

<PageTitle>Markup Strings</PageTitle>

<h1>Markup Strings Example</h1>

@((MarkupString)myMarkup)

@code {
    private string myMarkup =
        "<p class=\"text-danger\">This is a dangerous <em>markup string</em>.</p>";
}

MarkupStringExample.razor:

@page "/markup-string-example"

@((MarkupString)myMarkup)

@code {
    private string myMarkup =
        "<p class=\"text-danger\">This is a dangerous <em>markup string</em>.</p>";
}

MarkupStringExample.razor:

@page "/markup-string-example"

@((MarkupString)myMarkup)

@code {
    private string myMarkup =
        "<p class=\"text-danger\">This is a dangerous <em>markup string</em>.</p>";
}

MarkupStringExample.razor:

@page "/markup-string-example"

@((MarkupString)myMarkup)

@code {
    private string myMarkup =
        "<p class=\"text-danger\">This is a dangerous <em>markup string</em>.</p>";
}

MarkupStringExample.razor:

@page "/markup-string-example"

@((MarkupString)myMarkup)

@code {
    private string myMarkup =
        "<p class=\"text-danger\">This is a dangerous <em>markup string</em>.</p>";
}

Razor şablonları

Kullanıcı arabirimi kod parçacığını tanımlamak için render parçaları, Razor şablon söz dizimi kullanılarak tanımlanabilir. Razor şablonları aşağıdaki biçimi kullanır:

@<{HTML tag}>...</{HTML tag}>

Aşağıdaki örnekte, RenderFragment ve RenderFragment<TValue> değerlerini belirleyip şablonları doğrudan bir bileşenin içinde nasıl işleyebileceğiniz gösterilir. İşleme parçaları şablonlu bileşenlere bağımsız değişkenler olarak da geçirilebilir.

RazorTemplate.razor:

@page "/razor-template"

<PageTitle>Razor Template</PageTitle>

<h1>Razor Template Example</h1>

@timeTemplate

@petTemplate(new Pet { Name = "Nutty Rex" })

@code {
    private RenderFragment timeTemplate = @<p>The time is @DateTime.Now.</p>;
    private RenderFragment<Pet> petTemplate = (pet) => @<p>Pet: @pet.Name</p>;

    private class Pet
    {
        public string? Name { get; set; }
    }
}
@page "/razor-template"

<PageTitle>Razor Template</PageTitle>

<h1>Razor Template Example</h1>

@timeTemplate

@petTemplate(new Pet { Name = "Nutty Rex" })

@code {
    private RenderFragment timeTemplate = @<p>The time is @DateTime.Now.</p>;
    private RenderFragment<Pet> petTemplate = (pet) => @<p>Pet: @pet.Name</p>;

    private class Pet
    {
        public string? Name { get; set; }
    }
}
@page "/razor-template"

@timeTemplate

@petTemplate(new Pet { Name = "Nutty Rex" })

@code {
    private RenderFragment timeTemplate = @<p>The time is @DateTime.Now.</p>;
    private RenderFragment<Pet> petTemplate = (pet) => @<p>Pet: @pet.Name</p>;

    private class Pet
    {
        public string? Name { get; set; }
    }
}
@page "/razor-template"

@timeTemplate

@petTemplate(new Pet { Name = "Nutty Rex" })

@code {
    private RenderFragment timeTemplate = @<p>The time is @DateTime.Now.</p>;
    private RenderFragment<Pet> petTemplate = (pet) => @<p>Pet: @pet.Name</p>;

    private class Pet
    {
        public string? Name { get; set; }
    }
}
@page "/razor-template"

@timeTemplate

@petTemplate(new Pet { Name = "Nutty Rex" })

@code {
    private RenderFragment timeTemplate = @<p>The time is @DateTime.Now.</p>;
    private RenderFragment<Pet> petTemplate = (pet) => @<p>Pet: @pet.Name</p>;

    private class Pet
    {
        public string Name { get; set; }
    }
}
@page "/razor-template"

@timeTemplate

@petTemplate(new Pet { Name = "Nutty Rex" })

@code {
    private RenderFragment timeTemplate = @<p>The time is @DateTime.Now.</p>;
    private RenderFragment<Pet> petTemplate = (pet) => @<p>Pet: @pet.Name</p>;

    private class Pet
    {
        public string Name { get; set; }
    }
}

Önceki kodun işlenmiş çıkışı:

<p>The time is 4/19/2021 8:54:46 AM.</p>
<p>Pet: Nutty Rex</p>

Statik varlıklar

Blazor, statik varlıklar için ASP.NET Core uygulamalarının kuralına uyar. Statik varlıklar projenin web root (wwwroot) klasöründe veya wwwroot klasörünün altındaki klasörlerde yer alır.

Statik varlığın web köküne başvurmak için temel göreli bir yol (/) kullanın. Aşağıdaki örnekte logo.png fiziksel olarak {PROJECT ROOT}/wwwroot/images klasöründe yer alır. {PROJECT ROOT}, uygulamanın proje köküdür.

<img alt="Company logo" src="/images/logo.png" />

Bileşenler tilde-eğik çizgi gösterimini (~/) desteklemez.

Uygulamanın temel yolunu ayarlama hakkında bilgi için bkz. ASP.NET Core'u barındırma ve dağıtmaBlazor.

Etiket Yardımcıları bileşenlerde desteklenmez

Bileşenlerde Tag Helpers desteklenmez. Blazor'da Etiket Yardımcısı benzeri bir işlevsellik sağlamak için Etiket Yardımcısı ile aynı işlevselliğe sahip bir bileşen oluşturun ve Etiket Yardımcısı yerine o bileşeni kullanın.

Ölçeklenebilir Vektör Grafiği (SVG) resimleri

Blazor HTML'yi işlediğinden, Ölçeklenebilir Vektör Grafiği (SVG) resimleri de (.svg) dahil olmak üzere tarayıcı tarafından desteklenen resimler <img> etiketi yoluyla desteklenir:

<img alt="Example image" src="image.svg" />

Benzer şekilde SVG resimleri stil sayfası dosyasının (.css) CSS kurallarında desteklenir:

.element-class {
    background-image: url("image.svg");
}

Blazor, SVG içinde rastgele HTML görüntülemek için <foreignObject> öğesini destekler. İşaretleme rastgele HTML'yi, RenderFragment veya Razor bileşenini temsil edebilir.

Aşağıdaki örnekte şunlar gösterilir:

  • Bir string (@message) görüntüsü.
  • <input> öğesi ve value alanıyla iki yönlü bağlama.
  • Bir Robot bileşeni.
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
    <rect x="0" y="0" rx="10" ry="10" width="200" height="200" stroke="black" 
        fill="none" />
    <foreignObject x="20" y="20" width="160" height="160">
        <p>@message</p>
    </foreignObject>
</svg>

<svg xmlns="http://www.w3.org/2000/svg">
    <foreignObject width="200" height="200">
        <label>
            Two-way binding:
            <input @bind="value" @bind:event="oninput" />
        </label>
    </foreignObject>
</svg>

<svg xmlns="http://www.w3.org/2000/svg">
    <foreignObject>
        <Robot />
    </foreignObject>
</svg>

@code {
    private string message = "Lorem ipsum dolor sit amet, consectetur adipiscing " +
        "elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";

    private string? value;
}

Boşluk işleme özelliği

yönergesi @preservewhitespace değeriyle truekullanılmadığı sürece, şu durumda fazladan boşluk kaldırılır:

  • Bir öğenin içinde başta veya sonda yer alma.
  • RenderFragment / RenderFragment<TValue> parametresinin içinde (örneğin başka bir bileşene aktarılan alt içerik), başta veya sonda yer alıyorsa.
  • @if veya @foreach gibi bir C# kod bloğunun önünde veya ardından yer alıyorsa.

Boşluk kaldırma işlemi, white-space: pre gibi bir CSS kuralı kullanılırken işlenen çıkışı etkileyebilir. Bu performans iyileştirmesini devre dışı bırakmak ve boşluğu korumak için aşağıdaki eylemlerden birini gerçekleştirin:

  • Tercihi belirli bir bileşene uygulamak için @preservewhitespace true dosyasının (Razor) en üstüne .razor yönergesini ekleyin.
  • Tercihi bir alt dizine veya projenin tamamına uygulamak için @preservewhitespace true dosyasının içine _Imports.razor yönergesini ekleyin.

Çoğu durumda uygulamalar normal (ama daha hızlı) davranmaya devam ettiğinden hiçbir eylem gerekmez. Belirli bir bileşende boşluğun ayıklanması işleme sorununa yol açıyorsa, söz konusu bileşende @preservewhitespace true kullanarak bu iyileştirmeyi devre dışı bırakın.

Bileşenin kaynak işaretlemesinde boşluk korunur. Yalnızca boşluktan oluşan metin, hiçbir görsel etkisi olmasa bile tarayıcının DOM'unda işlenir.

Aşağıdaki bileşen işaretlemesini inceleyin:

<ul>
    @foreach (var item in Items)
    {
        <li>
            @item.Text
        </li>
    }
</ul>

Yukarıdaki örnek, aşağıdaki gereksiz boşlukları gösterir.

  • @foreach kod bloğunun dışında.
  • <li> öğesinin çevresinde.
  • @item.Text çıkışının çevresinde.

100 öğeden oluşan bir liste 400'ün üzerinde boşluk alanına neden olur. Ek boşlukların hiçbiri gösterilen çıktının üzerinde görsel olarak etkisi olmaz.

Bileşenler için statik HTML'yi işlerken, bir etiketin içindeki boşluk korunmaz. Örneğin bir bileşenin <img> dosyasında (Razor) aşağıdaki .razor etiketinin işlenen çıkışına bakın:

<img     alt="Example image"   src="img.png"     />

Önceki işaretlemeden kalan boşluk korunmaz:

<img alt="Example image" src="img.png" />

Kök bileşen

Kök Razor bileşen (kök bileşen), uygulama tarafından oluşturulan herhangi bir bileşen hiyerarşisinin yüklendiği ilk bileşendir.

Proje şablonu Blazor Web App kullanılarak oluşturulan bir uygulamada, App bileşeni (App.razor), sunucu tarafı MapRazorComponents<TRootComponent> dosyasında Program çağrısı için bildirilen tür parametresi ile varsayılan kök bileşen olarak belirtilir. Aşağıdaki örnekte, bileşenin App proje şablonundan Blazor oluşturulan bir uygulama için varsayılan olan kök bileşen olarak kullanılması gösterilmektedir:

app.MapRazorComponents<App>();

Not

Kök bileşeni etkileşimli hale getirme (bileşen gibi App ) desteklenmez.

Proje şablonundan Blazor Server oluşturulan bir uygulamada bileşen App (App.razor), Bileşen Etiketi YardımcısıPages/_Host.cshtmliçindeki varsayılan kök bileşen olarak belirtilir:

<component type="typeof(App)" render-mode="ServerPrerendered" />

Proje şablonundan Blazor WebAssembly oluşturulan bir uygulamada, App bileşen (App.razor) dosyasında varsayılan kök bileşen Program olarak belirtilir:

builder.RootComponents.Add<App>("#app");

Önceki kodda, CSS seçicisi #app, wwwroot/index.html içindeki <div> için belirtilmiş olan App bileşenini id olarak gösterir: app

<div id="app">...</app>

MVC ve Razor Sayfa uygulamaları, statik olarak işlenmiş kök bileşenleri kaydetmek için Bileşen Etiketi Yardımcısını kullanabilirBlazor WebAssembly.

<component type="typeof(App)" render-mode="WebAssemblyPrerendered" />

Statik olarak işlenmiş bileşenler yalnızca uygulamaya eklenebilir. Bunlar daha sonra kaldırılamaz veya güncelleştirilemez.

Daha fazla bilgi edinmek için aşağıdaki kaynaklara bakın: