Sdílet prostřednictvím


Vykreslení Razor komponent mimo ASP.NET Core

Razor komponenty lze vykreslit mimo kontext požadavku HTTP. Komponenty můžete vykreslit Razor přímo do řetězce nebo streamu nezávisle na hostitelském prostředí ASP.NET Core. To je vhodné pro scénáře, ve kterých chcete generovat fragmenty HTML, jako je generování e-mailového obsahu, generování statického obsahu webu nebo vytvoření modulu šablon obsahu.

V následujícím příkladu se komponenta Razor vykreslí do řetězce HTML z konzolové aplikace:

V příkazovém prostředí vytvořte nový projekt konzolové aplikace:

dotnet new console -o ConsoleApp1
cd ConsoleApp1

V příkazovém prostředí ve ConsoleApp1 složce přidejte odkazy na balíčky a Microsoft.AspNetCore.Components.WebMicrosoft.Extensions.Logging do konzolové aplikace:

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

V souboru projektu konzolové aplikace (ConsoleApp1.csproj) aktualizujte projekt konzolové aplikace tak, aby používal sadu Razor SDK:

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

Přidejte do projektu následující RenderMessage komponentu.

RenderMessage.razor:

<h1>Render Message</h1>

<p>@Message</p>

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

Aktualizujte Program soubor:

Všechna volání musí RenderComponentAsync být provedena v kontextu volání InvokeAsync na dispečer součásti. Dispečer komponenty je k dispozici ve HtmlRenderer.Dispatcher vlastnosti.

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);

Poznámka:

RenderComponentAsync Předejte ParameterView.Empty při vykreslování komponenty bez předání parametrů.

Alternativně můžete kód HTML napsat voláním TextWriteroutput.WriteHtmlTo(textWriter).

Úloha vrácená dokončením RenderComponentAsync po úplném vykreslení komponenty, včetně dokončení všech asynchronních metod životního cyklu. Pokud chcete vidět vykreslený kód HTML dříve, volejte BeginRenderingComponent místo toho. Potom počkejte, až se vykreslování komponenty dokončí, a to čekáním HtmlRootComponent.QuiescenceTask na vrácenou HtmlRootComponent instanci.