Domanda

Quando si chiama il metodo di analisi nel rasoio ViewEngine, gli errori di compilation vengono lanciati come TemplateComplatationException che contiene un elenco di errori. Tali errori si riferiscono a nomi di file temporanei, ma i file vengono eliminati prima di poter accedervi.

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();
    }

(Un po 'di sfondo) Sto usando il motore di rasoio "autonomo" senza MVC. Quando chiamo il Parse Voglio ottenere il maggior numero possibile di informazioni dettagliate da visualizzare all'utente.

È stato utile?

Soluzione

Il templateCompilationException di Razorengine è una classe che avvolge un compileratorerrorcolection che contenga CompilenerRor Oggetti, quindi il maggior numero di dettagli che potresti ottenere dagli oggetti del compilatore di Exception TemplateCompilationException sono le loro rispettive proprietà, che sembrano essere sufficienti con cui eseguire il debug. Considera e prova questo esempio

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);
}

Quando eseguo il mio esempio, questo è quello che ottengo, il che ti dice l'errore che è stato riscontrato e puoi scaricare i dati del modello per fare riferimento ai tuoi utenti.

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()

Altri suggerimenti

L'attuale versione V2.1 non fornisce la possibilità di sputare il codice sorgente. Esiste una funzione di debug nella nuova base di codice V3 che consente di esprimere il codice sorgente. Non lo fa per impostazione predefinita, perché sto cercando di rendere il codice il più performante possibile (e generare il codice due volte (una volta come codedom, una volta come stringa) non è l'ideale). Dovrai abilitare il Debug Flag sulla tua configurazione:

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

Ciò consentirà di leggere il codice sorgente quando viene lanciata un'eccezione.

Punto di interesse, attraverso il test dell'infrastruttura del compilatore Roslyn con la base di codice V3, accetta una fonte di stringa anziché codedom, quindi probabilmente apporterò una modifica futura da utilizzare anziché codedom direttamente - questo a sua volta significa che abbiamo accesso diretto a il codice sorgente senza doversi preoccupare di abilitare qualsiasi Debug Flag che sarà probabilmente deprecato.

V3 (attualmente V3.0.7Beta) è disponibile su NuGet (Install-Package RazorEngine). Stavo mirando a RTW lo scorso fine settimana ma non ci sono mai riuscito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top