Ich versuche, ein HTML-Dokument mit RazorEngine (http://razorengine.codeplex.com/) zu generieren. Alles ist meist funktioniert, aber das Problem, das ich jetzt habe, ist einige der HTML wird korrekt gerendert, und HTML, die ich geschachtelt habe, die als Literal HTML gerendert wird, so eher als der Browser zeigt die Tabellen & divs wie erwartet , es zeigt zHTML wird als literale Zeichenfolge mit RazorEngine gerendert. Wie kann ich das verhindern?
"<table></table><div></div>"
Ich trete diesen Prozess aus, indem Sie den folgenden Aufruf:
string completeHTML = RazorEngine.Razor.Parse("InstallationTemplate.cshtml", new { Data = viewModels });
Die completeHTML
wird dann in eine Datei geschrieben.
"InstallationTemplate.cshtml" ist definiert als:
@{
var installationReport = new InstallationReport(Model.Data);
}
<!DOCTYPE html>
<html>
<head></head>
<body>
<div>
<!-- I would expect this to write the rendered HTML
in place of "@installationReport.DigiChannels()" -->
@installationReport.DigiChannels()
</div>
</body>
</html>
Wo InstallationReport
DigiChannels
und sind wie folgt definiert:
public static class InstallationReportExtensions
{
public static string DigiChannels(this InstallationReport installationReport)
{
return installationReport.GetDigiChannelsHtml();
}
}
public class InstallationReport
{
public string GetDigiChannelsHtml()
{
// the following renders the template correctly
string renderedHtml = RazorReport.GetHtml("DigiChannels.cshtml", GetDigiChannelData());
return renderedHtml;
}
}
public static string GetHtml(string templateName, object data)
{
var templateString = GetTemplateString(templateName);
return RazorEngine.Razor.Parse(templateString, data);
}
Nach GetDigiChannelsHtml()
läuft und zurückkehrt renderedHtml
, die Linie der Ausführung kehrt zu TemplateBase.cs
in die Methode ITemplate.Run(ExecuteContext context)
, die definiert ist als:
string ITemplate.Run(ExecuteContext context)
{
_context = context;
var builder = new StringBuilder();
using (var writer = new StringWriter(builder))
{
_context.CurrentWriter = writer;
Execute(); // this is where my stuff gets called
_context.CurrentWriter = null;
}
if (Layout != null)
{
// Get the layout template.
var layout = ResolveLayout(Layout);
// Push the current body instance onto the stack for later execution.
var body = new TemplateWriter(tw => tw.Write(builder.ToString()));
context.PushBody(body);
return layout.Run(context);
}
return builder.ToString();
}
Wenn ich inspiziere builder.ToString()
, kann ich sehen, dass es richtige HTML für die InstallationTemplate.cshtml
Zeug enthält, und HTML für diestuff entkommen. Zum Beispiel:
Wie kann ich @installationReport.DigiChannels()
enthält die richtigen HTML anstelle des entkam HTML, die es zur Zeit tut?
Nein, ich habe das nicht versucht (wusste nicht einmal!). Es hat perfekt funktioniert. Vielen Dank. Ich muss ein paar Minuten warten, bevor ich deine Antwort als richtig markieren kann. – DaveDev
Danke, ja, es macht ziemlich genau dasselbe wie Html.Raw (wenn Rasierklingen mit ASP.NET MVC verwendet werden) –