2012-01-13 54 views
3

当在Razor ViewEngine中调用Parse方法时,会出现编译错误,如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时,我想获得尽可能详细的信息以显示给用户。

+2

您是否尝试添加'FileSystemWatcher'来将.cs文件复制到执行/编译目录之外? – arootbeer 2012-01-16 16:46:50

+0

无法让FileSystemWatcher为我启动。 – Mick 2014-03-03 23:58:05

回答

3

RazorEngine的TemplateCompilationException是一个包装CompilerErrorCollection的类,它包含CompilerError对象,因此您可能从TemplateCompilationException CompilerError对象获得的最多详细信息是它们各自的属性,这似乎足以用于调试。考虑并尝试当我运行我的例子,这是我所得到的,它告诉你遇到的错误(S),你可以转储模板数据,为用户引用这个例子

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

您是否能够在OP所要求的这种方法出现分析异常的情况下获取临时.cs文件的内容? – 2012-01-16 16:12:24

+0

他们也遇到了让他们的剃刀实施工作的问题,我的答案应该有所帮助。由于我们正在讨论临时编译文件,因此如何在内容构建和/或部署后获取内容?我认为找到实际问题并修复它(这就是我回答这个问题的原因)比通过临时文件挖掘更重要。 – jlafay 2012-01-16 16:20:08

+0

我不认为OP的实施有什么问题。如果Razor模板中没有错误,那么它和您的工作一样好。顺便说一句,在内部,您的'Razor.Parse'完全符合OP使用的内容。他想要做的是获取编译期间使用的临时文件。 – 2012-01-16 16:32:50

4

当前v2.1版本不提供吐出源代码的能力。在新的v3代码库中有一个调试功能,可以将源代码推出。它不会默认这样做,因为我试图使代码尽可能保持性能(并且生成代码两次(一次作为CodeDom,一次作为字符串)并不理想)。你将需要启用Debug标志您的配置:

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

这将使源代码时抛出一个异常被读取。

感兴趣的是,通过使用v3代码库测试Roslyn编译器基础结构,它接受一个字符串来源而不是CodeDom,所以我可能会做出将来的更改,而不是直接使用CodeDom - 这反过来意味着我们可以直接访问源代码,而不必担心启用任何可能会被弃用的Debug标志。

v3(目前v3.0.7beta)在Nuget上可用(Install-Package RazorEngine)。我上个周末的目标是RTW,但从未接近过。