Pregunta

Al llamar al método de análisis en el Razor ViewEngine, los errores de compilación se lanzan como TemplateComplilationException que contiene una lista de errores. Esos errores se refieren a nombres de archivo temporales, pero los archivos se eliminan antes de que pueda acceder a ellos.

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 poco de fondo) Estoy usando el motor de afeitar "independiente" sin MVC. Cuando llamo al Parse Quiero obtener la mayor cantidad de información detallada posible para mostrarle al usuario.

¿Fue útil?

Solución

TemplateCompilación de RazorEngine es una clase que envuelve una compiladora de colección que contiene Compilador Objetos, por lo que la mayoría de los detalles que posiblemente podría obtener de los objetos de compilador de TemplateCompilaciónxception son sus propiedades respectivas, que parecen ser suficientes para depurar. Considere y prueba este ejemplo

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

Cuando ejecuto mi ejemplo, esto es lo que obtengo, que le indica el error (s) que se encontró y puede descargar los datos de plantilla para hacer referencia a sus usuarios.

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

Otros consejos

La versión actual de V2.1 no proporciona la capacidad de escupir el código fuente. Hay una función de depuración en la nueva base de código V3 que permite que el código fuente se expulse. No hace esto de forma predeterminada, porque estoy tratando de hacer que el código sea lo mejor de rendimiento posible (y generar el código dos veces (una vez como codedom, una vez como una cadena) no es ideal). Tendrás que habilitar el Debug Indicando en su configuración:

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

Esto permitirá que se lea el código fuente cuando se lance una excepción.

Punto de interés, a través de la prueba de la infraestructura del compilador de Roslyn con la base de código V3, acepta una fuente de cadena en lugar de codedom, por lo que probablemente haré un cambio futuro para usarlo en lugar de codificar directamente, esto significa que tenemos acceso directo a el código fuente sin tener que preocuparse por habilitar cualquier Debug bandera que probablemente estará en desuso.

V3 (actualmente v3.0.7beta) está disponible en Nuget (Install-Package RazorEngine). Apuntaba a RTW el fin de semana pasado, pero nunca lo hice.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top