2012-01-13 76 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,但從未接近過。

相關問題