Quiero generar dos vistas diferentes (una como una cadena que se enviará como un correo electrónico) y la otra la página mostrada a un usuario.
¿Es esto posible en ASP.NET MVC beta?
He probado múltiples ejemplos:
1. RenderPartial a String en ASP.NET MVC Beta
Si uso este ejemplo, recibo el mensaje "No se puede redirigir después de que se hayan enviado los encabezados HTTP".
2. MVC Framework: capturando el resultado de una vista
Si uso esto, parece que no puedo hacer un redirectToAction, ya que intenta mostrar una vista que puede no existir. Si devuelvo la vista, está completamente desordenada y no se ve del todo bien.
¿Alguien tiene alguna idea / solución para estos problemas que tengo, o tiene alguna sugerencia para solucionarlos?
¡Muchas gracias!
A continuación se muestra un ejemplo. Lo que intento hacer es crear el método GetViewForEmail :
public ActionResult OrderResult(string ref)
{
//Get the order
Order order = OrderService.GetOrder(ref);
//The email helper would do the meat and veg by getting the view as a string
//Pass the control name (OrderResultEmail) and the model (order)
string emailView = GetViewForEmail("OrderResultEmail", order);
//Email the order out
EmailHelper(order, emailView);
return View("OrderResult", order);
}
Respuesta aceptada de Tim Scott (modificada y formateada un poco por mí):
public virtual string RenderViewToString(
ControllerContext controllerContext,
string viewPath,
string masterPath,
ViewDataDictionary viewData,
TempDataDictionary tempData)
{
Stream filter = null;
ViewPage viewPage = new ViewPage();
//Right, create our view
viewPage.ViewContext = new ViewContext(controllerContext, new WebFormView(viewPath, masterPath), viewData, tempData);
//Get the response context, flush it and get the response filter.
var response = viewPage.ViewContext.HttpContext.Response;
response.Flush();
var oldFilter = response.Filter;
try
{
//Put a new filter into the response
filter = new MemoryStream();
response.Filter = filter;
//Now render the view into the memorystream and flush the response
viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output);
response.Flush();
//Now read the rendered view.
filter.Position = 0;
var reader = new StreamReader(filter, response.ContentEncoding);
return reader.ReadToEnd();
}
finally
{
//Clean up.
if (filter != null)
{
filter.Dispose();
}
//Now replace the response filter
response.Filter = oldFilter;
}
}
Ejemplo de uso
Asumiendo una llamada desde el controlador para obtener el correo electrónico de confirmación del pedido, pasando la ubicación Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);