ASP.NET Core'da görüntülerle çalışma Blazor
Bu makalede, uygulamalarda görüntülerle Blazor çalışmaya yönelik yaygın senaryolar açıklanmaktadır.
Dinamik olarak görüntü kaynağı ayarlama
Aşağıdaki örnekte, C# alanıyla bir görüntünün kaynağının dinamik olarak nasıl ayarlanacağı gösterilmektedir.
Bu bölümdeki örnek için:
Herhangi bir kaynaktan üç görüntü alın veya yerel olarak kaydetmek için aşağıdaki görüntülerin her birine sağ tıklayın. Görüntüleri
image1.png
,image2.png
veimage3.png
olarak adlandırın.Görüntüleri uygulamanın web kökünde ()
wwwroot
adlıimages
yeni bir klasöre yerleştirin. Klasörün kullanımıimages
yalnızca gösterim amaçlıdır. Görüntüleri doğrudan klasörden sunma dahil, tercih ettiğiniz herhangi bir klasör düzenindewwwroot
düzenleyebilirsiniz.
Aşağıdaki ShowImage1
bileşeninde:
- Görüntünün kaynağı (
src
), C# dilinde değerineimageSource
dinamik olarak ayarlanır. - yöntemi,
ShowImage
yöntemineimageSource
geçirilen bir görüntüid
bağımsız değişkenine göre alanı güncelleştirir. - İşlenen düğmeler, klasördeki
ShowImage
kullanılabilir üç görüntününimages
her biri için bir görüntü bağımsız değişkeniyle yöntemini çağırır. Dosya adı, yöntemine geçirilen bağımsız değişken kullanılarak oluşturulur ve klasördekiimages
üç görüntüden biriyle eşleşir.
ShowImage1.razor
:
@page "/show-image-1"
<PageTitle>Show Image 1</PageTitle>
<h1>Show Image Example 1</h1>
@if (imageSource is not null)
{
<p>
<img src="@imageSource" />
</p>
}
@for (var i = 1; i <= 3; i++)
{
var imageId = i;
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
@code {
private string? imageSource;
private void ShowImage(int id)
{
imageSource = $"images/image{id}.png";
}
}
@page "/show-image-1"
<h1>Dynamic Image Source Example</h1>
@if (imageSource is not null)
{
<p>
<img src="@imageSource" />
</p>
}
@for (var i = 1; i <= 3; i++)
{
var imageId = i;
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
@code {
private string? imageSource;
private void ShowImage(int id)
{
imageSource = $"images/image{id}.png";
}
}
@page "/show-image-1"
<h1>Dynamic Image Source Example</h1>
@if (imageSource is not null)
{
<p>
<img src="@imageSource" />
</p>
}
@for (var i = 1; i <= 3; i++)
{
var imageId = i;
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
@code {
private string? imageSource;
private void ShowImage(int id)
{
imageSource = $"images/image{id}.png";
}
}
Yukarıdaki örnekte görüntünün kaynak verilerini tutmak için bir C# alanı kullanılır, ancak verileri tutmak için bir C# özelliği de kullanabilirsiniz.
Not
Önceki for
döngü örneğinde olduğu gibi i
bir lambda ifadesinde doğrudan bir döngü değişkeni kullanmaktan kaçının. Aksi takdirde, aynı değişken tüm lambda ifadeleri tarafından kullanılır ve bu da tüm lambdalarda aynı değerin kullanılmasına neden olur. Değişkenin değerini yerel değişkende yakalayın. Yukarıdaki örnekte:
- Döngü değişkeni
i
öğesineimageId
atanır. imageId
lambda ifadesinde kullanılır.
Alternatif olarak, önceki sorundan muzdarip olmayan ile Enumerable.Rangebir foreach
döngü kullanın:
@foreach (var imageId in Enumerable.Range(1,3))
{
<button @onclick="() => ShowImage(imageId)">
Image @imageId
</button>
}
Daha fazla bilgi için bkz . ASP.NET Core Blazor olay işleme.
Görüntü verilerini akışla aktarma
Görüntüyü genel URL'de barındırmak yerine 'nin akış birlikte çalışma özellikleri kullanılarak Blazorbir görüntü doğrudan istemciye gönderilebilir.
Bu bölümdeki örnek, JavaScript (JS) birlikte çalışma kullanarak görüntü kaynağı verilerini akışla aktarıyor. Aşağıdaki setImage
JS işlev, görüntünün etiketini id
ve veri akışını kabul eder<img>
. işlevi aşağıdaki adımları gerçekleştirir:
- Sağlanan akışı bir
ArrayBuffer
içine okur. - kaydırmak
ArrayBuffer
için birBlob
oluşturur. - Resmin gösterileceği adres olarak hizmet vermek için bir nesne URL'si oluşturur.
<img>
öğesini belirtilen ileimageElementId
yeni oluşturulan nesne URL'si ile Güncelleştirmeler.- Bellek sızıntılarını önlemek için işlev, bileşen bir görüntüyle çalışmayı bitirdiğinde nesne URL'sini atmak için çağırır
revokeObjectURL
.
<script>
window.setImage = async (imageElementId, imageStream) => {
const arrayBuffer = await imageStream.arrayBuffer();
const blob = new Blob([arrayBuffer]);
const url = URL.createObjectURL(blob);
const image = document.getElementById(imageElementId);
image.onload = () => {
URL.revokeObjectURL(url);
}
image.src = url;
}
</script>
Not
Konum hakkında genel yönergeler JS ve üretim uygulamalarına yönelik önerilerimiz için bkz . ASP.NET Core Blazor uygulamalarında JavaScript konumu.
Aşağıdaki ShowImage2
bileşen:
- ve System.Net.Http.HttpClientMicrosoft.JSInterop.IJSRuntimeiçin hizmetler ekler.
<img>
Görüntü görüntülemek için bir etiket içerir.GetImageStreamAsync
Bir görüntü için almak için bir Stream C# yöntemi vardır. Üretim uygulaması, belirli bir kullanıcıyı temel alan bir görüntüyü dinamik olarak oluşturabilir veya depolama alanından bir görüntü alabilir. Aşağıdaki örnek GitHub deposu için .NET avatarınıdotnet
alır.- Düğmenin kullanıcı tarafından seçilmesinde tetiklenen bir
SetImageAsync
yöntemi vardır.SetImageAsync
aşağıdaki adımları gerçekleştirir:- 'den
GetImageStreamAsync
öğesini Stream alır. - görüntü verilerinin Stream istemciye akışına izin veren bir DotNetStreamReferenceiçinde sarmalar.
- İstemcideki
setImage
verileri kabul eden JavaScript işlevini çağırır.
- 'den
Not
Sunucu tarafı uygulamalar istekte bulunmak için ayrılmış HttpClient bir hizmet kullandığından, sunucu tarafı Blazor uygulamasının geliştiricisi hizmeti kaydetmek için herhangi bir HttpClient eylem gerçekleştirmez. Uygulama bir proje şablonundan Blazor oluşturulduğunda istemci tarafı uygulamaların varsayılan HttpClient hizmet kaydı vardır. HttpClient İstemci tarafı uygulamasının Program
dosyasında bir hizmet kaydı yoksa, ekleyerek builder.Services.AddHttpClient();
bir hizmet kaydı sağlayın. Daha fazla bilgi için, bkz. ASP.NET Core'da IHttpClientFactory kullanarak HTTP isteği yapma.
ShowImage2.razor
:
@page "/show-image-2"
@inject HttpClient Http
@inject IJSRuntime JS
<PageTitle>Show Image 2</PageTitle>
<h1>Show Image Example 2</h1>
<p>
<img id="image" />
</p>
<button @onclick="SetImageAsync">
Set Image
</button>
@code {
private async Task<Stream> GetImageStreamAsync()
{
return await Http.GetStreamAsync(
"https://avatars.githubusercontent.com/u/9141961");
}
private async Task SetImageAsync()
{
var imageStream = await GetImageStreamAsync();
var dotnetImageStream = new DotNetStreamReference(imageStream);
await JS.InvokeVoidAsync("setImage", "image", dotnetImageStream);
}
}
@page "/show-image-2"
@inject HttpClient Http
@inject IJSRuntime JS
<h1>Stream Image Data Example</h1>
<p>
<img id="image" />
</p>
<button @onclick="SetImageAsync">
Set Image
</button>
@code {
private async Task<Stream> GetImageStreamAsync()
{
return await Http.GetStreamAsync(
"https://avatars.githubusercontent.com/u/9141961");
}
private async Task SetImageAsync()
{
var imageStream = await GetImageStreamAsync();
var dotnetImageStream = new DotNetStreamReference(imageStream);
await JS.InvokeVoidAsync("setImage", "image", dotnetImageStream);
}
}
@page "/show-image-2"
@inject HttpClient Http
@inject IJSRuntime JS
<h1>Stream Image Data Example</h1>
<p>
<img id="image" />
</p>
<button @onclick="SetImageAsync">
Set Image
</button>
@code {
private async Task<Stream> GetImageStreamAsync()
{
return await Http.GetStreamAsync(
"https://avatars.githubusercontent.com/u/9141961");
}
private async Task SetImageAsync()
{
var imageStream = await GetImageStreamAsync();
var dotnetImageStream = new DotNetStreamReference(imageStream);
await JS.InvokeVoidAsync("setImage", "image", dotnetImageStream);
}
}
Ek kaynaklar
- ASP.NET Core Blazor dosyası karşıya yüklemeleri
- Dosya yüklemeleri: Karşıya yükleme görüntüsü önizlemesi
- ASP.NET Core Blazor dosya indirmeleri
- ASP.NET Core Blazor'da JavaScript işlevlerinden .NET yöntemlerini çağırma
- ASP.NET Core Blazor'da .NET yöntemlerinden JavaScript işlevlerini çağırma
- Blazorörnekler GitHub deposu () (
dotnet/blazor-samples
nasıl indirilir)
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin