RazorをASP.NET MVCとは別に使用する

学生の活動の性質上、私はしばしばさまざまな研究室および学期論文を書かなければなりません。 これらの作業に不可欠な部分(ビジネスプログラミングタスクの80%など)は、データベース内で見つかった要素に関するレポートをコンパイルするためのコード、または長く複雑な操作のためのコードです。 .NET Framework内のデスクトッププログラミングでは、このような問題を解決するさまざまな方法があります。



後者について話します。



最も簡単で明白なオプションは、HTML文字列を手動で生成することです。 プラットフォームに精通している人はすぐにStringオブジェクトの連結を開始し、ドキュメントを読む人はStringBuilderクラスに注意を払います。 いずれにしても、String.Formatは常にレポートを生成する最も便利な方法ではありません。 しかし、ASP.NET MVCを使用するプラットフォームの同僚は、 Razorプレゼンテーションエンジンを十分に活用できません。 ここで疑問が生じます。ASP.NETRazorのパワーを自分の目的に使用してみませんか?

まず、 System.Web.Razorアセンブリを接続する必要があります。 ASP.NET MVCによって提供されるため、ターゲットコンピューターにインストールされていない場合は、必要なdllのローカルコピーを処理する必要があります。

ビューを継承する基本クラスを宣言します。

public abstract class TemplateBase { public StringBuilder Buffer { get; set; } public StringWriter Writer { get; set; } public TemplateBase() { Buffer = new StringBuilder(); Writer = new StringWriter(Buffer); } public abstract void Execute(); //     : "@foo.Bar" public virtual void Write(object value) { // Don't need to do anything special // Razor for ASP.Net does HTML encoding here. WriteLiteral(value); } //   : "<p>Foo</p>" public virtual void WriteLiteral(object value) { Buffer.Append(value); } // ...       -  ,     Razor    ,      }
      
      





まず、エンジンを初期化する必要があります。

 private RazorTemplateEngine SetupRazorEngine() { // 1. ,    C#   RazorEngineHost host = new RazorEngineHost(new CSharpRazorCodeLanguage()); // 2.   ,    .  ,    host.DefaultBaseClass = typeof(TemplateBase).FullName; // 3.        host.DefaultNamespace = "RazorOutput"; host.DefaultClassName = "Template"; // 4.       (using) host.NamespaceImports.Add("System"); // 5.     return new RazorTemplateEngine(host); }
      
      





ご存知のように、.NETはコードのオンザフライでのコンパイルをサポートしています。 この機能は、Razorによって使用されます。 したがって、この場合、テンプレートを使用してファイルを読み取り、別のアセンブリに保存する必要があります。

  //    GeneratorResults razorResult = null; using (TextReader rdr = new StringReader( MyTemplatesString )) razorResult = _engine.GenerateCode(rdr); CSharpCodeProvider codeProvider = new CSharpCodeProvider(); //       string outputAssemblyName = String.Format("Temp_{0}.dll", Guid.NewGuid().ToString("N")); CompilerResults results = codeProvider.CompileAssemblyFromDom( new CompilerParameters(new string[] { typeof(Form1).Assembly.CodeBase.Replace("file:///", "").Replace("/", "\\") }, outputAssemblyName), razorResult.GeneratedCode);
      
      





すべてがうまくいけば、使い方は簡単です:

  Assembly asm = Assembly.LoadFrom(outputAssemblyName); if (asm == null) { MessageBox.Show("    "); } else { Type typ = asm.GetType("RazorOutput.Template"); if (typ == null) { MessageBox.Show("  RazorOutput.Template   {0}", asm.FullName); } else { TemplateBase newTemplate = Activator.CreateInstance(typ) as TemplateBase; if (newTemplate == null) { MessageBox.Show("   RazorOutput.Template     TemplateBase"); } else { //    newTemplate     // ... newTemplate.Execute(); string resultHTML = newTemplate.Buffer.ToString(); newTemplate.Buffer.Clear(); return resultHTML; //          String,      } } }
      
      





それだけです。 残っているのは、TemplateBaseを介して、またはフォームのRazor構文を介して、プレゼンテーションデータを指定する方法の問題です。

 @functions { public string CustomerName { get; set; } public string ResetLink { get; set; } }
      
      





後者の場合、テンプレートの動的生成を放棄する必要がありますが、このデータにアクセスするのは非常に簡単です。



そのため、単純な動きの助けを借りて、MSの強力で便利なツールを使用して、「別の」テンプレートエンジンを記述する誘惑を回避しました。




1 .NET Frameworkで記述しているため、クライアントにインストールされていると想定されています。 しかし、Office、Crystal Reports、SQL Server、Visual Studio-必ずしもではありません



All Articles