2010-09-08 25 views
5

¿Sería una buena idea, y ejecutable, utilizar ASP.NET MVC View Engine para procesar html para que se envíe por correo electrónico?Utilice ASP.NET MVC como motor de plantilla de correo electrónico: ¿Buena idea?

Sé que es posible dejar que la vista se convierta en una cadena. Entonces eso podría usarse para construir el mensaje de correo. Como ASP.NET MVC ya se usa en la aplicación, puedo usar todas las cosas prácticas de ASP.NET MVC sin tener que usar Brail o NVelocity para mis "vistas de correo".

¿Buena idea? ¿Alguna advertencia? Ejemplos :)?

+1

Sí, funciona muy bien - Querrá echar un vistazo a esto: http://razorengine.codeplex.com/ –

Respuesta

4

Sí, es una buena idea y relatively easy to implement.

+0

Gracias, ¿qué pasa con el comportamiento asincrónico? No quiero analizar y enviar el correo electrónico para bloquear las solicitudes de página. – Bertvan

+0

En este caso, puede realizar esto en un nuevo hilo o utilizando un AsyncController. –

+0

Bien, veamos si esto funcionará :) – Bertvan

1

Personalmente creo que es una buena idea. Definitivamente mejor que poner una marca de margen con marcadores de posición en la base de datos.

La desventaja es que necesitará Visual Studio para editar esas plantillas y luego volver a compilar y volver a implementar el proyecto. No podría "subcontratar" el trabajo con plantillas a otro personal no técnico.

Y sí, agregar nuevas plantillas también requeriría su intervención personal.

+0

Volver a compilar es la mayor advertencia. Y también por eso, nos alejamos de este enfoque y comenzamos a mirar XSLT ... – Bertvan

1

Aquí, es mi versión de la RenderPartialToString como un método de extensión (que también se encarga de caminos, etc ..):

public static class ExtensionMethods 
{ 
    public static string RenderPartialToString(this ControllerBase controller, string partialName, object model) 
    { 
     var vd = new ViewDataDictionary(controller.ViewData); 
     var vp = new ViewPage 
     { 
      ViewData = vd, 
      ViewContext = new ViewContext(), 
      Url = new UrlHelper(controller.ControllerContext.RequestContext) 
     }; 

     ViewEngineResult result = ViewEngines 
            .Engines 
            .FindPartialView(controller.ControllerContext, partialName); 

     if (result.View == null) 
     { 
      throw new InvalidOperationException(
      string.Format("The partial view '{0}' could not be found", partialName)); 
     } 
     var partialPath = ((WebFormView)result.View).ViewPath; 

     vp.ViewData.Model = model; 

     Control control = vp.LoadControl(partialPath); 
     vp.Controls.Add(control); 

     var sb = new StringBuilder(); 

     using (var sw = new StringWriter(sb)) 
     { 
      using (var tw = new HtmlTextWriter(sw)) 
      { 
       vp.RenderControl(tw); 
      } 
     } 
     return sb.ToString(); 
    } 
} 

uso:

return this.RenderPartialToString("YourPartialView", yourModel); 

espero que esta ayuda ..

jim

0

Puede usar MVCMailer NuGet - utiliza las plantillas de vista de MVC y simplemente escribe una una sola línea de código para hacer esto!

Cuestiones relacionadas