Je veux sortir deux vues différentes (une sous forme de chaîne qui sera envoyée par e-mail) et l'autre la page affichée à un utilisateur.
Est-ce possible dans ASP.NET MVC beta?
J'ai essayé plusieurs exemples:
1. RenderPartial to String dans ASP.NET MVC Beta
Si j'utilise cet exemple, je reçois le message "Impossible de rediriger après l'envoi des en-têtes HTTP".
2. Framework MVC: capture de la sortie d'une vue
Si j'utilise ceci, je semble être incapable de faire une redirectToAction, car il essaie de rendre une vue qui peut ne pas exister. Si je retourne la vue, elle est complètement foirée et ne semble pas du tout correcte.
Quelqu'un a-t-il des idées / solutions à ces problèmes ou ai-je des suggestions pour de meilleurs?
Merci beaucoup!
Voici un exemple. Ce que j'essaie de faire, c'est de créer la méthode 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);
}
Réponse acceptée de Tim Scott (modifiée et formatée un peu par moi):
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;
}
}
Exemple d'utilisation
En supposant un appel du contrôleur pour obtenir l'e-mail de confirmation de commande, en passant l'emplacement Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);