2013-03-12 17 views
12

Vorrei utilizzare la mia vista Razor come una sorta di modello per l'invio di e-mail, , quindi vorrei "salvare" il mio modello in una vista, leggerlo nel controller come una stringa, fare alcune sostituzioni necessarie e quindi inviare esso.Come si converte una vista Razor in una stringa?

Ho una soluzione che funziona: il mio modello è ospitato da qualche parte come una pagina HTML, ma mi piacerebbe inserirlo nella mia applicazione (ad esempio, a mio avviso). Non so come leggere una vista come una stringa nel mio controller.

risposta

17

Io uso quanto segue. Mettilo sul tuo controller di base se ne hai uno, in questo modo puoi accedervi in ​​tutti i controller.

public static string RenderPartialToString(Controller controller, string viewName, object model) 
{ 
    controller.ViewData.Model = model; 

    using (StringWriter sw = new StringWriter()) 
    { 
     ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
     ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 
+0

ha scritto qualcosa di molto simile di recente. dolore in un $$ –

+0

@DaveA Hehe si, è un dolore davvero, dovrebbe essere più facile. – mattytommo

+0

Come posso fare lo stesso con .NET CORE? –

6

Date un'occhiata alla biblioteca RazorEngine, che fa esattamente quello che vuoi. L'ho usato prima per i modelli di email e funziona benissimo.

Si può solo fare qualcosa di simile:

// Read in your template from anywhere (database, file system, etc.) 
var bodyTemplate = GetEmailBodyTemplate(); 

// Substitute variables using Razor 
var model = new { Name = "John Doe", OtherVar = "Hello!" }; 
var emailBody = Razor.Parse(bodytemplate, model); 

// Send email 
SendEmail(address, emailBody); 
+0

Questo è utile, ma ho già del codice scritto che non voglio cambiare. Vorrei solo salvare il mio modello (html) in vista e leggere letteralmente html dalla vista come stringa, e fare sostituzioni nel controller. –

+0

Capito. Ho fatto quello che stai facendo in passato. Tuttavia, una volta che ho scoperto la libreria RazorEngine, ho notato che non solo rende molto più facile lo sviluppo del template, ma rende molto più semplice mantenere i tuoi template. È possibile memorizzare i modelli in un database o da qualche parte che è possibile modificarli senza modificare il codice. –

Problemi correlati