2012-01-13 18 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

実行/コンパイルディレクトリから.csファイルをコピーするための 'FileSystemWatcher'を追加しようとしましたか? – arootbeer

+0

私のためにFileSystemWatcherを起動できませんでした。 – Mick

答えて

3

RazorEngineのTemplateCompilationExceptionは、CompilerErrorオブジェクトを含むCompilerErrorCollectionをラップするクラスです。したがって、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

OPが求めているこのメソッドで解析例外が発生した場合、一時的な.csファイルの内容を取得できますか? –

+0

彼らはまた、彼らの剃刀の実装がうまくいくことに問題があり、私の答えはそれを助けるはずです。私たちは一時的なコンパイルファイルについて議論しているので、ビルドやデプロイ後にどのように内容を取得しますか?私は実際の問題を見つけてそれを修正することが、一時的なファイルを掘ることよりも重要だと思います。 – jlafay

+0

OPの実装に何か問題があるとは思わない。 Razorテンプレートにエラーがなければ、あなたのものと同じくらいうまくいくはずです。ちなみに、内部では、あなたの 'Razor.Parse'はOPが使っているものとまったく同じです。彼がやろうとしているのは、コンパイル時に一時ファイルを使用することです。 –

4

現在のv2.1リリースでは、ソースコードを吐き出すことはできません。新しいv3コードベースには、ソースコードをプッシュするためのデバッグ機能があります。コードをできるだけ実行可能なものにしようとしているので、これはデフォルトでは行いません。コードを2回(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を目指していましたが、決してそれには回りませんでした。

関連する問題