1

データオブジェクトをHTMLに変換するメカニズムを探しています。データオブジェクトの要素は、単純型と複合型の両方です。レンダリングのためにHtmlTextWriterで遊んでみましたが、複雑なタイプで行き詰まりました。

MineはASP.NetWebサイトプロジェクトです。フロントエンドの処理はjQueryの助けを借りて行われるため、サーバー側のコントロールの使用を避ける必要があります(したがって、組み込みのバインディング機能を廃止します)。データオブジェクトの基本的なHTMLを作成するだけで、残りの拡張(コンテンツの配置とスタイル設定)はフロントエンドで行われます。

私は簡単な解決策を探しています(Spring.Netはやり過ぎで圧倒的であり、NHAMLも非常に混乱していることがわかりました)。

さらに、私のアプリケーションは一定期間にわたって成長すると予想されるため、パフォーマンスをある程度尊重する必要があります。したがって、私はXML/XSLTを写真に取り入れることを避けています。


たとえば。Personオブジェクトは次のようになります。

文字列:名前
Int:年齢
複合型:住所(Street、City、Zipを含む)タイプ"Qualification"
の配列 :Qualifications(Degree、Passing Year、Gradesを含む)

必要な出力は次のとおりです。

<p id="userName" class="userName">John</p>
<p id="age" class="age">35</p>
<div id="address" class="address">
    <p id="street" class="street">Express Highway</p>
    <p id="city" class="city">Mumbai</p>
    <p id="zip" class="zip">400101</p>
</div>
<div id="qualifications" class="qualifications">
    <div id="qualification1" class="qualification">
        <p id="degree1" class="degree">B.Sc.</p>
        <p id="year1" class="year">1990</p>
        <p id="grade1" class="grade">A</p>
    </div>
    <div id="qualification2" class="qualification">
        <p id="degree2" class="degree">M.Sc.</p>
        <p id="year2" class="year">1992</p>
        <p id="grade2" class="grade">A</p>
    </div>
</div>

ここで注意すべき点は、ソースデータオブジェクトからプロパティをマップし、それにメタデータ(HTML要素属性など)を追加してから変換を実行するには、マッパーが必要になるということです。

4

2 に答える 2

0

私はそれを設計上の問題と考えており、コードではなく設計であるというより高い観点からの精巧な答えです! これを行う正しい方法は次のとおりです。

  • Person タイプは情報を保持しており、データ中心であるため、このクラスにhtml レンダリングの責任を負わせないことをお勧めします。

  • まず、すべてのビジネス/データ オブジェクトの抽象基本クラスが必要です。[必要になるので] BusinessBaseと仮定しましょう。

  • したがって、System.Web.UI.WebContorl から派生するサーバー コントロールの作成を開始する必要があります。set アクセサーで BusinessBase 型のオブジェクトを受け取るプロパティを公開します。

  • 次に、タイプ BusinessBase のサブクラスのプロパティに適用されるカスタム属性をいくつか定義する必要があります。この属性は、ビジネス/データ オブジェクトの特定のプロパティのレンダリング出力情報を保持します。レンダリングするすべてのプロパティを html で装飾します。

  • Web サーバー コントロールに戻り、リフレクションを使用して、タイプ BusinessBase のサーバー コントロール プロパティに割り当てられたオブジェクトの [カスタム属性を持つ] すべてのプロパティを反復処理します。属性に従って html をレンダリングします

この web-server-control とビジネス オブジェクトを asp.net フロントエンドで使用します。楽しむ。

これはハイレベルなデザインです。ビジネス オブジェクトに対してどのような html レンダリングが生成されるかについて、属性をより離散的かつ具体的にする必要があります。

于 2009-12-26T12:01:46.613 に答える
0

XmlSerializer または DataContractSerializer (より高速) を xslt 変換と一緒にベンチマークしましたか?

それでも xslt がサーバーにとって遅すぎると考える場合は、クライアントに xhtml としてレンダリングさせます。次に、CPU の「負荷」がすべてのユーザーに分散されます。

チュートリアルはw3schools.comにあります。

将来のスケーリングについて考えるのは賢明ですが、ボトルネックになることが実際にわかる前に、明らかなテクノロジーとソリューションを無視すべきではありません。

また、より複雑なプログラムによるルートと比較して、別のフロントエンド サーバーを追加するコストを計算する必要があります。パフォーマンスを向上させるためにキャッシングを検討することもできます。

[編集] 別の解決策は、クラスごとに WriteHtml メソッドを実装することです。トップ クラスからすべての子ライターを呼び出します。手巻きで効果的 (ただし、プロパティを追加する場合はライターを更新する必要があるため、より多くの管理が必要です)。

class Person
{
   public void WriteHtml(Stream writeStream);
   {
     writeStream.Write( "<p id="userName" class="userName">{0}</p>", UserName );
     etc.
     Adress.WriteHtml(writeStream);
     writeStream.Write( "<div id="address" class="address">" );
     foreach( Address ad in Adresses ) ad.WriteHtml(writeStream);
     writeStream.Write( "</div>" );
   }
}

各クラスで ToString() をオーバーライドして html 表現を返し、代わりにそれを使用することもできます。

クラスは単純であると述べているので、保守可能で読み取り可能である必要がありますが、再コンパイルせずに変更する方が簡単であるため、私はまだ xslt を好みます。オブジェクトの配列を保持するため、最も複雑なレンダリング部分はコンテナ タグをレンダリングすることです。それらの Collection クラスを実装した場合は、代わりにそのクラスで Container タグを維持できます。

class Person
{
   AddressCollection Adresses;
   // instead of
   Adress[] Adresses;
}

じゃあ問題は、あなたが「シンプル」だと思うものは何ですか :D

于 2009-12-25T23:34:52.143 に答える