Ich möchte zwei verschiedene Ansichten ausgeben (eine als Zeichenkette, die als E-Mail gesendet wird), und die andere die Seite, die einem Benutzer angezeigt wird.
Ist dies in ASP.NET MVC Beta möglich?
Ich habe mehrere Beispiele ausprobiert:
1. RenderPartial zu String in ASP.NET MVC Beta
Wenn ich dieses Beispiel verwende, erhalte ich die Meldung "Cannot redirect after HTTP Header gesendet wurden.".
2. MVC-Framework: Erfassen der Ausgabe einer Ansicht
Wenn ich dies verwende, scheine ich nicht in der Lage zu sein, eine redirectToAction zu machen, da es versucht, eine Ansicht zu rendern, die möglicherweise nicht existiert. Wenn ich die Ansicht zurückgebe, ist sie ist völlig durcheinander und sieht überhaupt nicht richtig.
Hat jemand Ideen/Lösungen für diese Probleme, die ich habe, oder hat Vorschläge für bessere Lösungen?
Vielen Dank!
Nachstehend finden Sie ein Beispiel. Was ich versuche, ist die Erstellung der GetViewForEmail-Methode :
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);
}
Akzeptierte Antwort von Tim Scott (von mir ein wenig geändert und formatiert):
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;
}
}
Beispiel für die Verwendung
Angenommen, der Controller ruft die E-Mail zur Bestellbestätigung auf und übergibt den Standort des Site.Master.
string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);