Rendern einer Ansicht on-the-fly
-
03-07-2019 - |
Frage
Ich entwickle eine ASP.NET MVC-Anwendung, die dem Benutzer eine Bestätigungsmail sendet. Für die E-Mail selbst, würde Ich mag eine Ansicht erstellen und dann diese Ansicht rendern und es senden und die .NET-Mail-Objekte verwendet wird.
Wie kann ich das mit der MVC-Framework zu tun?
Lösung 2
Wie pro meinem Kommentar zu Richard Antwort, dieser Code hat funktioniert, aber es ist immer Folge eines ‚umleiten kann nicht nach dem HTTP-Header gesendet wurden‘ Fehler.
Nach einem Los von rund Google graben und frustriert, fand ich endlich einen Code, den Trick zu tun scheint, zu diesem Artikel:
http: //mikehadlow.blogspot .com / 2008/06 / mvc-framework-Erfassung-Ausgang-of-view_05.html
Diese Methode Kerl ist seine eigene Httpcontext zu erstellen.
Anstatt die MVCContrib BlockRenderer verwende ich ersetzen Sie einfach die aktuelle Httpcontext mit einer neuen, die eine Antwort findet, die zu einem String schreibt.
Diese Methode funktioniert perfekt (ein kleiner Unterschied ist, dass ich für die Darstellung meiner Teilansicht, aber kein Drama gibt eine separate Aktion zu schaffen hatte).
Andere Tipps
Sie müssen grundsätzlich IView.Render
verwenden. Sie können die Ansicht erhalten, indem ViewEngineCollection.FindView
(ViewEngines.Engines.FindView
für die Standardwerte) verwendet wird. Rendern Sie die Ausgabe in eine TextWriter
und stellen Sie sicher, dass Sie ViewEngine.ReleaseView
danach rufen. Beispielcode unten (ungetestet):
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();
Ich lasse Bildschirmtextsystem / TempData Sie.
Das funktioniert für mich:
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);
}
}
}
}
}
}