質問

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 ユーザーに表示するために、できるだけ多くの詳細情報を取得したいと思います。

役に立ちましたか?

解決

RazorengineのTemplateCompilationExceptionは、コンパイラエラーコレクションを含むクラスです 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()

他のヒント

現在のV2.1リリースでは、ソースコードを吐き出す機能は提供されません。新しいV3コードベースには、ソースコードを押し出すことができるデバッグ機能があります。コードを可能な限りパフォーマンスしようとしているため(そしてコードを2回生成する(1回、文字列として1回)、理想的ではありません)、デフォルトではこれを行いません。を有効にする必要があります Debug 構成のフラグ:

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

これにより、例外がスローされたときにソースコードを読み取ることができます。

興味のある点、V3コードベースを使用してRoslynコンパイラインフラストラクチャをテストすることにより、それはコードドームの代わりに文字列ソースを受け入れるので、私はそれを直接使用するために将来の変更を行う可能性があります - これは順番に私たちが直接アクセスできることを意味します任意を有効にすることを心配する必要なくソースコード Debug おそらく非推奨になる旗。

v3(現在v3.0.7beta)はnugetで入手できます(Install-Package RazorEngine)。私は先週末にRTWを目指していましたが、それに丸くなることはありませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top