Es ist bekannt, wie ein HTML-Code einer bestimmten Teilansicht in der ASP.NET-Ansichts-Engine generiert wird .
Wenn diese Funktion jedoch in der Rasiermesser-Teilansicht verwendet wird, funktioniert sie nicht, da die Ausnahme besagt, dass die Teilansicht nicht von "UserControl" abgeleitet ist.
Wie kann ich das Rendering korrigieren, um die Rasiermesser-Teilansicht zu unterstützen?
Ich brauche das, weil ich E-Mails aus diesen Teilansichten generiere ...
AKTUALISIEREN:
Code, der fehlschlägt (@mcl):
public string RenderPartialToString(string controlName, object viewData)
{
ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };
viewPage.Url = this.GetUrlHelper();
string fullControlName = "~/Views/Email/" + controlName + ".ascx";
viewPage.ViewData = new ViewDataDictionary(viewData);
viewPage.Controls.Add(viewPage.LoadControl(fullControlName));
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
}
return sb.ToString();
}
c#
asp.net-mvc
razor
Peter Stegnar
quelle
quelle
Antworten:
Aktualisieren
quelle
Obwohl bereits angemessene Antworten gegeben wurden, möchte ich eine weniger ausführliche Lösung vorschlagen, die ohne die in einer MVC-Controller-Klasse verfügbaren Hilfsmethoden verwendet werden kann. Mit einer Drittanbieter-Bibliothek namens "RazorEngine" können Sie die .NET-Datei IO verwenden, um den Inhalt der Rasiererdatei abzurufen und aufzurufen
Holen Sie sich das Dritte Bibliothek hier .
quelle
Sie können auch die
RenderView Controller extension
von hier ( Quelle) verwenden ) verwendenund benutze es so:
es funktioniert für Rasierer und Webformulare viewengines
quelle
Ich sah, dass sich jemand fragte, wie man das für einen anderen Controller macht.
In meinem Fall hatte ich alle meine E-Mail-Vorlagen im Ordner "Ansichten / E-Mail", aber Sie können dies so ändern, dass es an den Controller übergeben wird, für den Sie Ansichten zugeordnet haben.
Im Wesentlichen wird dazu ein Controller wie AccountController verwendet, um ihn als E-Mail-Controller zu betrachten, sodass der Code im
Views/Email
Ordner angezeigt wird . Dies ist erforderlich, da dieFindView
Methode keinen geraden Pfad als Parameter verwendet, sondern einenControllerContext
.Nach dem Rendern der Zeichenfolge wird der AccountController wieder in den Ausgangszustand versetzt, der vom Response-Objekt verwendet werden soll.
quelle
großartiger Code; kleiner tipp: wenn man manchmal mehr daten umgehen muss und nicht nur das viewmodel ..
quelle
@ Jgauffin-Antwort als HtmlHelper-Erweiterung ausleihen:
Verwendung in einer Rasiermesseransicht:
quelle