Pregunta

Estoy desarrollando una aplicación MVC de ASP.NET que enviará al usuario un correo electrónico de confirmación. Para el correo electrónico en sí, me gustaría crear una vista y luego renderizarla y enviarla utilizando los objetos de correo .NET.

¿Cómo puedo hacer esto utilizando el marco MVC?

¿Fue útil?

Solución 2

Según mi comentario sobre la respuesta de Richard, este código funcionó, pero siempre dio como resultado un error "No se puede redireccionar después de que se hayan enviado los encabezados HTTP".

Después de un lote de indagar en Google y estar frustrado, finalmente encontré un código que parece hacer el truco en este artículo:

http: //mikehadlow.blogspot .com / 2008/06 / mvc-framework-capturing-output-of-view_05.html

El método de este chico es crear su propio HttpContext.

  

En lugar de usar el MVCContrib BlockRenderer, simplemente reemplazo el HttpContext actual por uno nuevo que alberga una Respuesta que escribe en un StringWriter.

Este método funciona perfectamente (una pequeña diferencia es que tuve que crear una Acción separada para mostrar mi vista parcial, pero no hay drama allí).

Otros consejos

Básicamente necesitas usar IView.Render . Puede obtener la vista utilizando ViewEngineCollection.FindView ( ViewEngines.Engines.FindView para los valores predeterminados). Procese la salida a un TextWriter y asegúrese de llamar a ViewEngine.ReleaseView después. Código de ejemplo a continuación (sin probar):

StringWriter output = new StringWriter();

string viewName = "Email";
string masterName = "";

ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, viewName, masterName);

ViewContext viewContext = new ViewContext(ControllerContext, result.View, viewData, tempData);
result.View.Render(viewContext, output);

result.ViewEngine.ReleaseView(ControllerContext, result.View);

string viewOutput = output.ToString();

Te dejaré viewData / tempData a ti.

Esto me funcionó:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace Profiteer.WebUI.Controllers
{
    public class SampleController : Controller
    {
        public ActionResult Index()
        {
            RenderViewAsHtml(RouteData.Values["controller"].ToString(), 
                             RouteData.Values["action"].ToString());
            return View();
        }

        private void RenderViewAsHtml(string controllerName, string viewName)
        {
            var vEngine = (from ve in ViewEngineCollection
                           where ve.GetType() == typeof(RazorViewEngine)
                           select ve).FirstOrDefault();
            if (vEngine != null)
            {
                var view = 
                    vEngine.FindView(
                        ControllerContext, 
                        viewName, "_Layout", false).View as RazorView;
                if (view != null)
                {
                    var outPath = 
                       Server.MapPath(
                          string.Format("~/Views/{0}/{1}.html", 
                                        controllerName, viewName));
                    using (var sw = new StreamWriter(outPath, false))
                    {
                        var viewContext = 
                            new ViewContext(ControllerContext, 
                                            view, 
                                            new ViewDataDictionary(), 
                                            new TempDataDictionary(), 
                                            sw);
                        view.Render(viewContext, sw);
                    }
                }
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top