Razor è un engine di templating estremamente versatile; lo usiamo ogni giorno per realizzare le view delle applicazioni ASP.NET MVC, ma in realtà può essere sfruttato anche per altri scopi. Per esempio, può essere molto comodo creare dei file cshtml o vbhtml per descrivere template di email o file di report:
@model Customer <html> <body> <p>Ciao, @this.Model.Name</p> <p>ti scriviamo questa mail per dimostrare quanto Razor sia versatile!</p> </body> </html>
Questo tipo di contenuto, a differenza di una normale view, dovrà essere renderizzato all'interno di una variabile string, così che possiamo poi effettivamente utilizzarlo come body del messaggio email. Per questo scopo, possiamo realizzare un extension method simile al seguente, che accetti in ingresso il nome della view e l'istanza del model:
public static string ViewToString<T>(this Controller controller, string viewName, T model) { var controllerContext = new ControllerContext( controller.HttpContext, controller.RouteData, controller); var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName); using (var sw = new StringWriter()) { var viewContext = new ViewContext( controllerContext, viewResult.View, new ViewDataDictionary<T>(), new TempDataDictionary<T>(), sw); viewContext.ViewData.Model = model; try { viewResult.View.Render(viewContext, sw); } finally { viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View); } return sw.ToString(); } }
Gran parte del metodo consiste nella ricostruzione del contesto di esecuzione, costituito da ControllerContext e ViewContext, necessari a Razor per effettuare il rendering della view. Una volta recuperata la view in base al nome, proprio tramite il ViewContext, possiamo associare il model passato in ingresso.
Una volta che tutte queste variabili sono create, possiamo finalmente invocare il metodo Render e scrivere su uno StringWriter il risultato del rendering.
L'utilizzo di questo metodo è estremamente comodo e semplice:
public ActionResult SendEmail(...) { var customer = new Customer() { Name = "Marco De Sanctis" }; string body = this.ViewToString("emailTemplate", customer); // invio email qui ... }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Evitare il flickering dei componenti nel prerender di Blazor 8
Criptare la comunicazione con mTLS in Azure Container Apps
Elencare le container images installate in un cluster di Kubernetes
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Usare lo spread operator con i collection initializer in C#
Sfruttare i KeyedService in un'applicazione Blazor in .NET 8
Generare file PDF da Blazor WebAssembly con iText
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Migrare una service connection a workload identity federation in Azure DevOps
Utilizzare Tailwind CSS all'interno di React: primi componenti
Utilizzare un service principal per accedere a Azure Container Registry
Le novità di Angular: i miglioramenti alla CLI
I più letti di oggi
- Creare un messaggio di posta in diversi formati con ASP.NET 2.0
- Caricare un DTO esposto da un servizio tramite una query LINQ to Entities in Entity Framework
- Utilizzare il metodo reduce in #javascript https://aspit.co/ccc di @morwalpiz
- Elencare gli utenti di un dominio NT con ADSI
- Utilizzare SQL e #linq per eseguire una query con #entityframework Core https://aspit.co/bfv di @sm15455 #efcore1
- Disponibile il codice sorgente di ASP.NET MVC
- Concludiamo in bellezza con Giancarlo Sudano di Microsoft: q# for quantum programming Siamo in live streaming da: https://aspit.co/netconf-22 #aspilive #netconfit
- Caricare i dati di configurazione allo startup di un'applicazione Angular
- rilasciati nuovi template per la #aspnet web pages. funzionano anche con #webmatrix: http://u.aspitalia.com/lu
- Creare automaticamente una pipeline YAML da una sua definizione in Azure DevOps