Freigeben über


Rendern von Razor-Komponenten außerhalb von ASP.NET Core

Razor-Komponenten können außerhalb des Kontexts einer HTTP-Anforderung gerendert werden. Sie können Razor-Komponenten als HTML direkt in eine Zeichenfolge oder einen Stream rendern – unabhängig von der ASP.NET Core-Hostingumgebung. Dies ist praktisch in Szenarien, in denen Sie HTML-Fragmente generieren möchten, beispielsweise zum Generieren von E-Mail-Inhalt oder statischen Website-Inhalten oder zum Entwickeln einer Engine für die Inhaltsvorlagenerstellung.

Im folgenden Beispiel wird aus einer Konsolenanwendung eine Razor-Komponente in eine HTML-Zeichenfolge gerendert:

Erstellen Sie in einer Befehlsshell ein neues Konsolen-App-Projekt:

dotnet new console -o ConsoleApp1
cd ConsoleApp1

Fügen Sie in einer Befehlsshell im Ordner ConsoleApp1 der Konsolen-App Paketverweise für Microsoft.AspNetCore.Components.Web und Microsoft.Extensions.Logging hinzu:

dotnet add package Microsoft.AspNetCore.Components.Web
dotnet add package Microsoft.Extensions.Logging

Aktualisieren Sie in der Projektdatei der Konsolen-App (ConsoleApp1.csproj) das Projekt der Konsolen-App, um das Razor SDK zu verwenden:

- <Project Sdk="Microsoft.NET.Sdk">
+ <Project Sdk="Microsoft.NET.Sdk.Razor">

Fügen Sie dem Projekt die folgende RenderMessage-Komponente hinzu.

RenderMessage.razor:

<h1>Render Message</h1>

<p>@Message</p>

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

Aktualisieren Sie die Datei Program:

Alle RenderComponentAsync-Aufrufe müssen im Kontext des InvokeAsync-Aufrufs für einen Komponentenverteiler erfolgen. Ein Komponentenverteiler ist über die HtmlRenderer.Dispatcher-Eigenschaft verfügbar.

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ConsoleApp1;

IServiceCollection services = new ServiceCollection();
services.AddLogging();

IServiceProvider serviceProvider = services.BuildServiceProvider();
ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();

await using var htmlRenderer = new HtmlRenderer(serviceProvider, loggerFactory);

var html = await htmlRenderer.Dispatcher.InvokeAsync(async () =>
{
    var dictionary = new Dictionary<string, object?>
    {
        { "Message", "Hello from the Render Message component!" }
    };

    var parameters = ParameterView.FromDictionary(dictionary);
    var output = await htmlRenderer.RenderComponentAsync<RenderMessage>(parameters);

    return output.ToHtmlString();
});

Console.WriteLine(html);

Hinweis

Übergeben Sie beim Rendern der Komponente ParameterView.Empty an RenderComponentAsync, ohne Parameter zu übergeben.

Alternativ können Sie den HTML-Code in eine TextWriter-Klasse schreiben, indem Sie output.WriteHtmlTo(textWriter) aufrufen.

Die von RenderComponentAsync zurückgegebene Aufgabe wird abgeschlossen, wenn die Komponente vollständig gerendert wurde, einschließlich der Beendigung aller asynchronen Lebenszyklusmethoden. Wenn Sie den gerenderten HTML-Code schon früher einsehen möchten, rufen Sie stattdessen BeginRenderingComponent auf. Warten Sie dann, bis das Rendering der Komponente abgeschlossen wurde, indem Sie HtmlRootComponent.QuiescenceTask für die zurückgegebene HtmlRootComponent-Instanz abwarten.