tutorial que mvc espaƱol asp.net-mvc frameworks view render

asp.net-mvc - que - razor html



Renderizar una vista sobre la marcha (3)

Esto funcionó para mí:

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); } } } } } }

Estoy desarrollando una aplicación ASP.NET MVC 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 renderizar esa vista y enviarla usando los objetos de correo .NET.

¿Cómo puedo hacer esto usando el framework MVC?


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

Después de cavar en torno a Google y sentirme frustrado, finalmente encontré un código que parece funcionar, en este artículo:

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

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

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

Este método funciona a la perfección (una pequeña diferencia es que tuve que crear una Acción por separado para renderizar mi vista parcial, pero no el drama).


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

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();

Dejaré viewData / tempData para ti.