Frage

Wenn Sie die Parse -Methode im Rasiermesser ViewEngine aufrufen, werden Kompilierungsfehler als templateComplilationException geworfen, die eine Liste von Fehlern enthält. Diese Fehler beziehen sich auf temporäre Dateinamen, die Dateien werden jedoch gelöscht, bevor Sie darauf zugreifen können.

static void Main(string[] args)  
{
    var service = TemplateServiceFactory.CreateTemplateService(Language.CSharp, true);
    string result = "";
    try
    {
       result = service.Parse("Hello @DateTime.NowXX ");
    }
    catch (TemplateCompilationException ex)
    {
      foreach (var error in ex.Errors)
         if (!string.IsNullOrEmpty(error.FileName))
             Console.WriteLine( File.ReadAllText( error.FileName ));
    }  //                                         ^^^^ File does not exist!

    Console.WriteLine( result );       
    Console.ReadKey();
    }

(Ein kleiner Hintergrund) Ich benutze die Rasiermotor "eigenständige" ohne MVC. Wenn ich das rufe Parse Ich möchte so viele detaillierte Informationen wie möglich für den Benutzer erhalten.

War es hilfreich?

Lösung

Razorengins TemplateCompilationException ist eine Klasse, die eine CompilerErrorCollection enthält, die enthalten CompilerError Objekte, also die meisten Details, die Sie möglicherweise aus den TemplateCompilationException -CompilerError -Objekten erhalten können, sind ihre jeweiligen Eigenschaften, die ausreichen, um mit zu debuggen. Betrachten Sie und versuchen Sie dieses Beispiel

try
{
    Razor.Parse("My erroneous @DateTime.Now.foo()");
}
catch(TemplateCompilationException ex)
{
    foreach(var error in ex.Errors)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("Compile Error Num: \t" + error.ErrorNumber);
        sb.AppendLine("Error Text:\n\t" + error.ErrorText);
        Console.WriteLine(sb.ToString());
    }
    Console.WriteLine("Erroneous Template:\n\t" + ex.Template);
}

Wenn ich mein Beispiel ausführe, bekomme ich das, was ich bekomme, was Ihnen die aufgetretenen Fehler mitteilt, die auf die Fehler gestoßen sind, und Sie können die Vorlagendaten auf die Referenz für Ihre Benutzer abgeben.

Compile Error Num:   CS1061
Error Text:
  'System.DateTime' does not contain a definition for 'foo' and no 
  extension method     'foo' accepting a first argument of type 
  'System.DateTime' could be found (are you missing a using directive 
  or an assembly reference?)

Erroneous Template:
    My erroneous @DateTime.Now.foo()

Andere Tipps

Die aktuelle Version v2.1 bietet nicht die Möglichkeit, den Quellcode auszuspucken. In der neuen V3 -Codebasis gibt es eine Debugging -Funktion, mit der der Quellcode herausgedrückt wird. Dies ist nicht standardmäßig, da ich versuche, den Code so leistungsfähig wie möglich zu gestalten (und den Code zweimal zu generieren (einmal als codiert, einmal als Zeichenfolge) ist nicht ideal). Sie müssen die aktivieren Debug FALTEN Sie Ihre Konfiguration:

var config = new TemplateServiceConfiguration { Debug = true };
var service = new TemplateService(config);

Dadurch kann der Quellcode gelesen werden, wenn eine Ausnahme ausgelöst wird.

Point of Interest, indem die Roslyn -Compiler -Infrastruktur mit der V3 -Codebasis getestet wird, akzeptiert sie eine String -Quelle anstelle von codedom. Ich werde wahrscheinlich eine zukünftige Änderung vornehmen, um diese anstelle von codedom direkt zu verwenden. Dies bedeutet wiederum, dass wir direkten Zugriff haben, auf den wir direkten Zugriff haben Der Quellcode, ohne sich Sorgen machen zu müssen, um etwas zu aktivieren Debug Flagge, die wahrscheinlich veraltet sein wird.

V3 (derzeit v3.0.7beta) ist auf Nuget (Install-Package RazorEngine). Ich wollte letztes Wochenende RTW, aber nie dazu gekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top