In ASP.NET Core abbiamo a disposizione una semplice interfaccia per renderizzare programmaticamente un componente Razor. Pensiamo al caso in cui vogliamo per esempio comporre il testo HTML di una email, e abbiamo bisogno di un templating engine che ci permetta di generarlo a partire da un set di variabili.
Grazie a questa funzionalità, potremo utilizzare i componenti Razor e la loro sintassi familiare e intuitiva.
Immaginiamo di avere un Record che rappresenti un appuntamento di una clinica:
public record AppointmentDetails( string Email, string Patient, string DoctorName, DateTime Day);
Il nostro obiettivo è quello di generare una mail di conferma a partire da questi dati. Iniziamo con la creazione di un componente Razor che chiameremo EmailTemplate:
<p>Dear @Appointment.Patient</p> <p>We hope this email finds you well.</p> <p>This email confirms your appointment with Dr.@Appointment.DoctorName for the next @Appointment.Day.ToShortDateString() </p> @* .. altro testo qui .. *@ @code { [Parameter] public AppointmentDetails Appointment { get; set; } }
Come possiamo notare, al di là del markup, abbiamo aggiunto un parametro di tipo AppointmentDetail, che ci aspettiamo di passare dall'esterno.
Da codice, possiamo eseguire il componente e generare l'HTML tramite la classe HtmlRenderer:
var renderer = new HtmlRenderer(_serviceProvider, _loggerFactory); var html = await renderer.Dispatcher.InvokeAsync(async () => { var dictionary = new Dictionary<string, object?> { { "Appointment", appointment } }; var parameters = Microsoft.AspNetCore .Components.ParameterView.FromDictionary(dictionary); var output = await renderer.RenderComponentAsync<EmailTemplate>(parameters); return output.ToHtmlString(); });
Per istanziare quest'oggetto, abbiamo bisogno di un IServiceProvider e di una ILoggerFactory, che possiamo iniettare tramite dependency injection. HtmlRenderer espone un metodo RenderComponentAsync, che però non possiamo invocare direttamente, a meno che non ci troviamo all'interno di un InvokeAsync del Dispatcher di ASP.NET Core.
Quindi, nel delegate che passiamo a InvokeAsync, non dobbiamo far altro che istanziare un dictionary con i parametri da passare (Appointment, nel nostro caso), e poi finalmente chiamare RenderComponentAsync, passando il tipo del template come generic.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Usare lo spread operator con i collection initializer in C#
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Estrarre dati randomici da una lista di oggetti in C#
Creare una libreria CSS universale - Rotazione degli elementi
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Creare un'applicazione React e configurare Tailwind CSS
Utilizzare un service principal per accedere a Azure Container Registry
Utilizzare il nuovo modello GPT-4o con Azure OpenAI
Limitare le richieste lato server con l'interactive routing di Blazor 8
I più letti di oggi
- Simulare Azure Cosmos DB in locale con Docker
- Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
- .NET Conference Italia 2023 - Milano e Online
- .NET Conference Italia 2024 - Milano
- Configurare lo startup di applicazioni server e client con .NET Aspire
- MS03-45: risolti i problemi della patch 824141
- Utilizzare Container Queries nominali