Voglio generare due diverse visualizzazioni (una come stringa che verrà inviata come e-mail) e l'altra la pagina visualizzata a un utente.
È possibile in ASP.NET MVC beta?
Ho provato più esempi:
1. RenderPartial su String in ASP.NET MVC Beta
Se uso questo esempio, ricevo il messaggio "Impossibile reindirizzare dopo che le intestazioni HTTP sono state inviate".
2. MVC Framework: acquisizione dell'output di una vista
Se lo uso, mi sembra di non essere in grado di eseguire un reindirizzamento ToAction, poiché tenta di eseguire il rendering di una vista che potrebbe non esistere. Se restituisco la vista, è completamente incasinata e non sembra affatto corretta.
Qualcuno ha idee / soluzioni a questi problemi che ho o ho suggerimenti per quelli migliori?
Grazie molto!
Di seguito è riportato un esempio. Quello che sto cercando di fare è creare il metodo 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);
}
Risposta accettata da Tim Scott (modificata e formattata un po 'da me):
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;
}
}
Esempio di utilizzo
Supponendo una chiamata dal controller per ottenere l'e-mail di conferma dell'ordine, passando la posizione Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);