Share via


ASP.NET Core 외부에서 구성 요소 렌더링 Razor

Razor 구성 요소는 HTTP 요청의 컨텍스트 외부에서 렌더링할 수 있습니다. 구성 요소를 HTML로 직접 문자열에 렌더링 Razor 하거나 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)에서 SDK를 사용하도록 Razor 콘솔 앱 프로젝트를 업데이트합니다.

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

참고 항목

매개 변수를 RenderComponentAsync 전달하지 않고 구성 요소를 렌더링할 때 전달 ParameterView.Empty 합니다.

또는 호출output.WriteHtmlTo(textWriter)하여 HTML을 작성 TextWriter 할 수 있습니다.

비동기 수명 주기 메서드를 완료하는 것을 포함하여 구성 요소가 완전히 렌더링될 때 완료된 작업이 RenderComponentAsync 완료됩니다. 렌더링된 HTML을 이전에 관찰하려면 대신 호출 BeginRenderingComponent 합니다. 그런 다음 반환 HtmlRootComponent 된 인스턴스에서 대기하여 구성 요소 렌더링이 완료되기를 HtmlRootComponent.QuiescenceTask 기다립니다.