ASP.NET Core Razor bileşenleri
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.
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:
- Razorgörünümler, MVC uygulamaları için Razor işaretleme tabanlı sayfalar.
- Bileşenleri Görüntüle, Razor Sayfalar ve MVC uygulamalarında tüm yanıtlar yerine içerik parçalarını işlemede kullanılır.
Ö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.
ComponentBase
baş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ınaProductDetail.razor
olan ve uygulamanınComponents
klasörününPages
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çinBlazorSample.Components.Pages
ad alanına çözer.{PROJECT NAMESPACE}
proje ad alanıdır. Bileşenler C# adı bağlama kurallarına uyar. Bu örnektekiHome
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.
- Aynı
Aşağıdakiler desteklenmez:
-
global::
nitelemesi. - Kısmen nitelenmiş adlar. Örneğin bir bileşene
@using BlazorSample.Components
ekleyip ardından uygulamanınNavMenu
klasöründekiComponents/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ınProductDetail.razor
olduğunu ve bileşenin uygulamanınPages
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
ileIndex
bileşeni içinBlazorSample.Pages
ad alanına çözümler.{PROJECT NAMESPACE}
proje ad alanıdır. Bileşenler C# adı bağlama kurallarına uyar. Bu örnektekiIndex
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.
- Aynı
Aşağıdakiler desteklenmez:
-
global::
nitelemesi. - Kısmen nitelenmiş adlar. Örneğin bir bileşene
@using BlazorSample
ekleyip ardından uygulamanınNavMenu
klasöründekiShared
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çinheadingFontStyle
. - 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.
-
System.String bir başlığı iletmek için
Title
. -
System.Int32 içinde bir sayıyı
Count
'e aktarmak için.
-
System.String bir başlığı iletmek için
Kullanıcı tanımlı bir referans türü (
PanelBody
), bir Bootstrap kart gövdesiniBody
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çinBody
kullanan üst bileşenden vePanelBody
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
nesnesininTitle
özelliği.
Beşinci ParameterChild
bileşen örneği de Count
parametresini ayarlar. Dikkat edin, string
tü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"
, buradacount
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
) venull
dahildir, ancak isterseniz bunları kullanmayı seçebilirsiniz. ÖrneğinIsFixed="@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 veyarequired
eriş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.
- Blazor düzenleri
- Bileşen hiyerarşisi boyunca verileri geçirme
- Şablonlu bileşenler
- Genel özel durum işleme
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
veyanull
ise, öznitelik ayarlanmaz veya daha önce ayarlanmışsa kaldırılır. - veya
checked
value
gibi Blazor DOM özellikleri için DOM özelliğini .NET değerine göre ayarlar. .NET değerifalse
veyanull
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-pressed
bazı 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 vevalue
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 true
kullanı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.cshtml
iç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:
ASP.NET Core