3

Razor ViewEngineでParseメソッドを呼び出すと、コンパイルエラーは、エラーのリストを含む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();
    }

(少し背景)MVCなしでRazorエンジン「スタンドアロン」を使用しています。電話をかけるときはParse、ユーザーに表示するためにできるだけ詳細な情報を取得したいと思います。

4

2 に答える 2

4

現在のv2.1リリースでは、ソースコードを吐き出す機能は提供されていません。新しいv3コードベースには、ソースコードをプッシュできるデバッグ機能があります。私はコードを可能な限りパフォーマンスの高いものにしようとしているので、デフォルトではこれを行いません(そして、コードを2回生成する(CodeDomとして1回、文字列として1回)のは理想的ではありません)。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を目指していましたが、それを実現することはできませんでした。

于 2012-01-20T12:26:16.557 に答える
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()
于 2012-01-16T16:05:53.447 に答える