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?

War es hilfreich?

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);
                    }
                }
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top