Отрисовка Razor компонентов вне ASP.NET Core

Razor компоненты могут отображаться вне контекста HTTP-запроса. Компоненты можно отрисовывать Razor как HTML непосредственно в строку или поток независимо от среды размещения ASP.NET Core. Это удобно для сценариев, в которых требуется создать фрагменты HTML, например для создания содержимого электронной почты, создания статического содержимого сайта или для создания обработчика шаблонов контента.

В следующем примере Razor компонент отрисовывается в HTML-строку из консольного приложения:

В командной оболочке создайте проект консольного приложения:

dotnet new console -o ConsoleApp1
cd ConsoleApp1

В командной оболочке в папке ConsoleApp1 добавьте ссылки на пакеты и Microsoft.AspNetCore.Components.WebMicrosoft.Extensions.Logging в консольное приложение:

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

В файле проекта консольного приложения (ConsoleApp1.csproj) обновите проект консольного приложения, чтобы использовать Razor пакет SDK:

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

Добавьте следующий RenderMessage компонент в проект.

RenderMessage.razor:

<h1>Render Message</h1>

<p>@Message</p>

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

Обновите файл Program:

Все вызовы RenderComponentAsync должны выполняться в контексте вызова InvokeAsync диспетчера компонентов. Диспетчер компонентов доступен из HtmlRenderer.Dispatcher свойства.

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

Примечание.

Передается ParameterView.EmptyRenderComponentAsync при отрисовке компонента без передачи параметров.

Кроме того, можно написать HTML-код в TextWriter вызов output.WriteHtmlTo(textWriter).

Задача, возвращаемая RenderComponentAsync после полной отрисовки компонента, включая выполнение любых асинхронных методов жизненного цикла. Если вы хотите просмотреть отрисованный HTML ранее, вызовите BeginRenderingComponent вместо этого. Затем дождитесь завершения отрисовки компонента, ожидая HtmlRootComponent.QuiescenceTask возвращаемого экземпляра HtmlRootComponent .