2013-07-24 4 views
5

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 InstallationReportDigiChannels 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:

enter image description here

Wie kann ich @installationReport.DigiChannels() enthält die richtigen HTML anstelle des entkam HTML, die es zur Zeit tut?

Antwort

18

Haben Sie versucht:

@Raw(installationReport.DigiChannels()) 

Edit: Ich kann es in folgenden Weise nutzen könnte (MVC3)

@Html.Raw(installationReport.DigiChannels()) 
+0

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

+0

Danke, ja, es macht ziemlich genau dasselbe wie Html.Raw (wenn Rasierklingen mit ASP.NET MVC verwendet werden) –

5

Die Alternative zu @Raw ist Ihre API zu ändern HtmlString s an geeigneten Stellen zurückkehren

Stellt eine HTML-codierte Zeichenfolge dar, die nicht erneut codiert werden sollte.

Das standardmäßige Rasiererverhalten ist string s zu kodieren.

Verwandte Themen