Wie render eine ASP.NET MVC view als string?

Möchte ich die Ausgabe mit zwei verschiedenen Ansichten (als ein string, der gesendet wird, als eine E-Mail), und die andere die Seite für den Benutzer angezeigt.

Ist dies möglich ASP.NET MVC beta?

Habe ich versucht mehrere Beispiele:

1. RenderPartial String in ASP.NET MVC Beta

Wenn ich dieses Beispiel verwenden, erhalte ich die "Nicht umleiten nach HTTP
Kopfzeilen gesendet wurden.".

2. MVC-Framework: die Erfassung der Ausgabe eines Sicht

Wenn ich diese, ich scheine unfähig zu sein, zu tun, eine redirectToAction, wie es
versucht das Rendern einer Ansicht, die nicht existieren kann. Wenn ich Rückkehr die Ansicht, es
ist komplett Durcheinander und sieht nicht Recht.

Hat jemand irgendwelche Ideen/Lösungen für diese Probleme, die ich habe, oder haben Sie irgendwelche Vorschläge für besseres?

Vielen Dank!

Unten ist ein Beispiel. Was ich bin versucht zu tun ist erstellen Sie die 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);
}

Akzeptiert die Antwort von Tim Scott (geändert formatiert und ein wenig von mir):

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

Vorausgesetzt, ein Aufruf aus dem controller zu Holen Sie sich die Bestätigungs-E-Mail, vorbei an der Website.Master-Standort.

string myString = RenderViewToString(this.ControllerContext, "~/Views/Order/OrderResultEmail.aspx", "~/Views/Shared/Site.Master", this.ViewData, this.TempData);
  • Wie können Sie diese mit einer Ansicht, die stark typisiert ist? Dh. wie kann ich feed ein Modell auf die Seite?
  • Dies nicht verwenden können, und erstellen Sie JsonResult danach, da der content-Typ nicht festgelegt werden können, nachdem die Header gesendet wurden (weil Flush sendet Ihnen).
  • Denn es gibt keine einzige richtige Antwort, nehme ich an. 🙂 Ich erstellte eine Frage, die war spezifisch für mich, aber ich wusste, dass es wäre eine weithin fragte einer, als gut.
  • Die vorgeschlagene Lösung funktioniert nicht in MVC 3.
  • Die vorgeschlagene Lösung ist über zwei Jahre alt. Ich würde nicht erwarten, dass es funktioniert für MVC-3 an! Außerdem gibt es bessere Möglichkeiten, dies jetzt zu tun.
  • Danke. Behoben!

Schreibe einen Kommentar