2009-05-22 18 views
8

いくつかのHTMLファイルを生成する必要のある.NETコンソールアプリケーションがあります。私はStringBuilderでHTMLを構築して内容をファイルに書き出すことができましたが、データがどこに送られるかのプレースホルダを使って何らかのテンプレートファイルを使用し、実行時にデータを処理する方が良いと思っていました。.NETアプリケーションのテンプレートを使用してHTMLを生成する

aspx、T4、またはASP.NET MVCで使用できる代替ビューエンジンを使用する方法があると思いますが、コンソールに統合するのが最も簡単なことはわかりませんアプリケーション(またはそれらを統合する方法について)

私は、フォームの何かを呼び出すことができる終わるしたい:あなたがこれを行うことが

GenerateHtml(htmlPath, template, customDataObject); 

答えて

3

マットが述べたように、sparkはいいですが、いくつかの単純なテンプレートでは余計なことがあり、MVCで使用しないと複雑になります。

私は個人的にNVelocityで多くの成功を持っていたし、私もそれを使用しての簡単な例/ラッパーを公開

:またhttp://simpable.com/code/simpletemplate/

、NVelocity上で実行GraffitiCMSの全体テーマシステム(場合、私は火花を使用しているだろうが、この作業に利用可能でした)。

-Scott

+0

はい私はNVelocityを見てきました。それは私の問題の最も有望な解決策のように見えます。私は城のプロジェクトが作った「新しい」バージョンをどこからダウンロードするのか迷っています。 –

+0

私は最終的に城のプロジェクトソース全体をダウンロードして自分自身のNVelocity.dllを構築した後に動作させました。テンプレートを正しく読み込む方法を理解するのに時間がかかりましたが、一度それを実行すると、私のニーズを完全に満たしています。ありがとう –

+2

こんにちはスコット、少なくともこのページにいくつかのポインタを持っているといいですね。どうやらウェブサイトがダウンしている – samy

14

一つの方法は、生成する変換を実行し、その後XMLとしてあなたcustomDataObjectをシリアライズ、テンプレートとしてXSLファイルを作成しています必要なHTML

更新:ここで私は他の人が主張している文字列置換方法が好きですが、XML/XSLの使用にはある程度の柔軟性があります。たとえば、広告申込情報オブジェクトのリストを含むオーダーオブジェクトなどのプロパティがリストにある場合、広告申込情報をレンダリングするロジックをコードに書き込む必要があります。

XSLを使用すると、シリアル化された注文オブジェクトXMLをXSLに渡して、生成する必要があるHTMLをXSLで処理させることができます。これは、再構築/展開のすべての余分な手間をかけずに、アプリケーションに余分なコードを追加することなく、XSLを適切に編集したり、バリエーション(注文概要、詳細な注文など)を持つことができることを意味します。

しかし、それはあなたがレンダリングする必要があるものの複雑さに依存します。一部のジョブでは、文字列の置換がより明白です。他の人にとっては、XSLが方法です。私が言ったように、我々は両方を使用します。

6

ここにあなたが何をしようとして達成するために、かなり単純な方法を示し、いくつかのコードです:これを使用して

using System; 
using System.IO; 

public class HtmlTemplate 
{ 
    private string _html; 

    public HtmlTemplate(string templatePath) 
    { 
     using (var reader = new StreamReader(templatePath)) 
      _html = reader.ReadToEnd(); 
    } 

    public string Render(object values) 
    { 
     string output = _html; 
     foreach (var p in values.GetType().GetProperties()) 
      output = output.Replace("[" + p.Name + "]", (p.GetValue(values, null) as string) ?? string.Empty); 
     return output; 
    } 
} 

public class Program 
{ 
    void Main() 
    { 
     var template = new HtmlTemplate(@"C:\MyTemplate.txt"); 
     var output = template.Render(new { 
      TITLE = "My Web Page", 
      METAKEYWORDS = "Keyword1, Keyword2, Keyword3", 
      BODY = "Body content goes here", 
      ETC = "etc" 
     }); 
     Console.WriteLine(output); 
    } 
} 

を、あなたがしなければならないすべては、いくつかのHTMLテンプレートを作成して、そのような交換可能なトークンでそれらを埋めているが、 [TITLE]、[METAKEYWORDS]などのように指定します。次に、トークンを置き換える値を含む匿名オブジェクトを渡します。また、値オブジェクトを辞書などで置き換えることもできます。

+0

それは私が旧姓でしょうコレクションの周りにループする能力を欠いているが、これは、いいです私のHTMLページは書式設定された項目のリストを作成する必要があります。 –

+0

私が言ったように、ハードコードされたオブジェクトの代わりに辞書を使うことができます。これはコンパイル時にあなたのフィールドがどのようになるかわからない場合にループを繰り返すコレクションを持つことができることを意味します。 –

1

Kevが示すようにXSLTを使用する代わりに、名前付き文字列の書式設定を使用することもできます。 Phil Haackのコードlike this exampleを使用しています。

ここでテンプレートを文字列として(ファイルから読み込んで)、指定されたオブジェクトを使用してフォーマットすることができます。

今、あなたはこのような何か行うことができます:

var person = new { FirstName = "rune", LastName = "grimstad" }; 
string template = "<html><body><h1>Hello {FirstName} {LastName}</h1></body></html>"; 
string html = NamedFormat(template, person); 
関連する問題