Razor ViewEngine Временная компиляция .cs файлов - PullRequest
3 голосов
/ 13 января 2012

При вызове метода Parse в Razor ViewEngine ошибки компиляции выдаются как исключение TemplateComplilationException, которое содержит список ошибок. Эти ошибки относятся к временным именам файлов, но файлы удаляются, прежде чем вы сможете получить к ним доступ.

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

(немного фона) Я использую Razor движок "автономно" без MVC. Когда я звоню по номеру Parse, я хочу получить как можно больше подробной информации для отображения пользователю.

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Текущая версия v2.1 не предоставляет возможности выкладывать исходный код. В новой кодовой базе v3 есть функция отладки, которая позволяет вытолкнуть исходный код. По умолчанию он этого не делает, потому что я пытаюсь сделать код как можно более быстрым (и генерировать код дважды (один раз как CodeDom, один раз как строку) не идеально). Вам нужно включить флаг Debug в вашей конфигурации:

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

Это позволит читать исходный код при возникновении исключения.

Интересно, что, протестировав инфраструктуру компилятора Roslyn с использованием кодовой базы v3, он принимает строковый источник вместо CodeDom, поэтому я, вероятно, внесу будущее изменение, чтобы использовать его вместо CodeDom напрямую - это, в свою очередь, означает, что мы имеем прямой доступ к исходному коду, не беспокоясь о включении любого флага Debug, который, скорее всего, не рекомендуется.

v3 (в настоящее время v3.0.7beta) доступна на Nuget (Install-Package RazorEngine). В прошлые выходные я был нацелен на RTW, но так и не нашел его.

3 голосов
/ 16 января 2012

TemplateCompilationException RazorEngine - это класс, который оборачивает коллекцию CompilerErrorCollection, содержащую CompilerError объекты, поэтому большинство деталей, которые вы можете получить из объектов TemplateCompilationException CompilerError, - это их соответствующие свойства, которых, по-видимому, достаточно для отладки.Рассмотрите и попробуйте этот пример

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

Когда я запускаю свой пример, это то, что я получаю, в котором сообщается об обнаруженных ошибках, и вы можете сбросить данные шаблона для справки для ваших пользователей.

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