2012-01-13 1 views
3

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

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

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

+2

Вы пытались добавить файл 'FileSystemWatcher' для копирования файлов .cs из каталога выполнения/компиляции? – arootbeer

+0

Не удалось запустить FileSystemWatcher для меня. – Mick

ответ

3

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

Можете ли вы получить содержимое временного файла .cs в случае исключения синтаксического разбора с этим методом, о котором спрашивает OP? –

+0

У них также возникают проблемы с выполнением их работы с бритвой, и мой ответ должен помочь в этом. Поскольку мы обсуждаем временные файлы компиляции, как вы будете получать содержимое после его создания и/или развертывания? Я думаю, что найти актуальную проблему и ее исправление (вот почему я ответил на это) важнее, чем копать временные файлы. – jlafay

+0

Я не думаю, что что-то не так с реализацией OP. Если ошибок в шаблоне Razor не было, все будет работать так же хорошо, как и у вас. Кстати, внутренне ваш 'Razor.Parse' делает именно то, что использует OP. То, что он пытается сделать, - это получить временные файлы, используемые во время компиляции. –

4

Текущая версия 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, но так и не дотянулся.

Смежные вопросы