2009-03-04 6 views
3

Ich entwickle eine ASP.NET MVC-Anwendung, die dem Benutzer eine Bestätigungs-E-Mail senden wird. Für die E-Mail selbst möchte ich eine Ansicht erstellen und diese Ansicht anschließend rendern und sie mit den .NET-Mail-Objekten senden.Rendering einer Ansicht on-the-fly

Wie kann ich dies mit dem MVC-Framework tun?

+0

Ich glaube, Sie MVC bedeuten, nicht MCV –

+0

kann nicht glauben, dass ich zwei Fehler in einer Reihe hat, und beide das gleiche Wort! – Jonathan

Antwort

2

Laut meinem Kommentar zu Richards Antwort funktionierte dieser Code, aber es führte immer zu einem 'Kann nicht umleiten, nachdem HTTP-Header gesendet wurden' Fehler.

Nach einem viel von rund Google Graben und frustriert, fand ich endlich einen Code, den Trick, zu diesem Artikel zu tun scheint:

http://mikehadlow.blogspot.com/2008/06/mvc-framework-capturing-output-of-view_05.html

Dieser Kerl Methode ist seine eigene erstellen HttpContext.

Rather than use the MVCContrib BlockRenderer I simply replace the current HttpContext with a new one that hosts a Response that writes to a StringWriter.

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 hatten).

3

Sie müssen grundsätzlich IView.Render verwenden. Sie können die Ansicht anzeigen, indem Sie ViewEngineCollection.FindView (ViewEngines.Engines.FindView für die Standardwerte) verwenden. Rendern Sie die Ausgabe an eine TextWriter und stellen Sie sicher, dass Sie danach ViewEngine.ReleaseView aufrufen. 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(); 

werde ich Bildschirmtextsystem/TempData Ihnen überlassen.

+0

Diese Methode funktionierte nach einigen Änderungen, außer dass es zu dem folgenden Fehler führte: "Nach dem Senden von HTTP-Headern kann nicht umgeleitet werden". Dies hat etwas damit zu tun, dass HTTP-Header das freigegebene Response-Objekt und nicht seinen eigenen Stream herunterschicken (Entschuldigung, mein Verständnis der .NET HTTP-Objekte ist nicht alles). – Jonathan

+0

Warum wird es überhaupt umgeleitet? –

+1

Was macht ReleaseView eigentlich? Ist es wirklich wichtig? Was, wenn ich es nicht nenne? – NightElfik

0

Das ist für mich gearbeitet:

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); 
        } 
       } 
      } 
     } 
    } 
} 
Verwandte Themen