私は数年間 Web 開発を行ってきました。会社によって理解も異なります。最近、ブログプロジェクトに取り組みました。 Web 開発におけるテンプレート クラスの役割を認識しました。夜は家にいます。私は、asp.ne 開発用に特別に設計されたテンプレート クラスを作成できないかと常に考えていました。そこで、このテンプレートクラスを作成しました。
ダウンロードアドレスはここをクリック
ダウンロードした 500sea.txt ファイルの名前を Templet.rar に変更して開くだけです。
開いていれば
http://img.club.163.com/images/user/other/500sea
500sea.txt ファイルをダウンロードするように求めるプロンプトは表示されません。次に、Internet Express およびその他のツールを使用してこのアドレスをダウンロードし、ダウンロードした 500sea.txt ファイルを *.rar ファイルに変更します。
以下は内部の説明ファイルです
//------------------------------------------------ -------------------------------------------------- ------------------------//
導入:
このテンプレート クラスは、3 層アーキテクチャの Web サイト開発用に作成されています。 StringTempletReplet.dll コンポーネント
テンプレート クラスが含まれます。 StringTempletReplet 名前空間のテンプレート クラスは、UI レイヤーまたは
ロジック層で使用されます。
************************************************* * ***************************
実行方法:
解凍された Templet フォルダーを参照するために、Templet という名前の仮想ディレクトリを作成します。
内部 RetuenString.aspx、ReturnText.aspx、WriteArticon.aspx、を実行します。
LongLoop.aspx ページ。ページに対応する cs ファイルには、対応する指示があります。
ページを初めて開くときは、デリゲート オブジェクトとテンプレート ファイルをキャッシュに保存する必要があるため、実際の速度は最初のページに依存します。
1回後。
************************************************* * ***************************
原理の紹介:
ラベル交換用のテンプレートです。 C# でポインター演算を使用してラベルの位置を見つけました。
デリゲート オブジェクトを使用してイメージ タグに対応する解析関数をポイントし、静的オブジェクトを使用してすべてのデリゲート オブジェクトをキャッシュします。
テンプレート本体を変更せずに、テンプレートのコンテンツ全体をキャッシュします。テンプレートは動的に変更できます。
************************************************* * ***************************
タグの紹介:
特殊記号のペア {$ と $} の間の内容はラベルです
のように
{$タグ名:パラメータ1:パラメータ2:パラメータ3::文字10$}
{$タグ名:パラメータ1:パラメータ2::byte10$}
{$dt[5][名前]$}
ラベルは、ラベル内の :: 記号によって 2 つの部分 (ラベル パラメーター部分) と (コマンド制御部分) に分かれています。
{$タグ名:パラメータ1:パラメータ2:パラメータ3::byte10$}
(タグパラメータ部) :: (コマンド制御部)
これら 2 つの部分では、ラベル パラメータ部分とコマンド制御部分を : 記号で区切ります。
タグパラメータ部分---最初のものはタグ名であり、これはタグ解析関数の対応する名前であり、後続のものは関数のパラメータです。
タグ解析関数はすべてのパラメータ タイプを文字列タイプとして受け入れ、パラメータの数は 0 ~ 20 です。
関数の戻り値の型は文字列型です。パラメータはラベル上にハードコーディングすることも、動的に書き込むこともできます。
コマンド制御部分 - コマンド シンボルの文字とバイトが 2 つだけになり、その後に傍受基準を示す数値パラメータが続きます。
署名解析結果の長さ (10 文字、10 バイトなど)。
将来的には他のコマンド アンド コントロール シンボルも拡張する予定です。
ラベルと関数の対応については、Business.cs ファイルの説明を参照してください。
タグの具体的な使用規則については、template/templet/aa1.htm の説明を参照してください。
特定の呼び出しルールについては、プロジェクト内の 3 つの aspx ページを参照してください。
WriteArticon.aspx - テンプレートを読み取り、書き込まれたファイルを解析して静的ページを生成するニュース システム
ReturnText.aspx - テンプレートの解析を読み取り、文字列を返します。外観を変更する必要が多いページの作成に使用されます。
スキンが剥がされたページ。テンプレートは動的に変更できます。
RetuenString.aspx - タグ文字列を受け入れ、解析結果を返します。一般的に ajax で使用されます。
************************************************* * ******************************
ラベルの動的値:
タグ解析関数は、タグで渡される固定パラメータを受け入れることができます。動的パラメータを受け入れるには 3 つの方法があります
Datatable オブジェクトと Hashtable オブジェクトをテンプレート クラスに渡した後
(データテーブルはデータレイヤーから取得され、ハッシュテーブルは通常ページ変数とその他の変数です)
1. dt[5][name] ---- データテーブルの 5 行の name 列の値を取得することを意味します。最初の行は数値です。
2番目は列名です
2. dt[name] ---- ループの外では、Datatable の行 0 の name 列の値を取得することを意味します。
1 つのパラメータは列名を表します
---- ループ内では、Datatable の name 列の値を取得することを意味します。
これらの行は、loop タグのパラメータによって決定されます。
3. page[PageId] ----- Hashtable オブジェクトの PageId キーの値を取得し、文字列型を返すことを表します。
たとえば、 {$two パラメータブックマーク:dt[3][word]:page[UserId]::character 10$}
{$dt[5][name]$} {$dt[name]$} {$page[ページID ]$}
または
{$dt[5][名前]::文字 10$} {$dt[名前]::文字 10$} {$page[ページ ID]::文字 10$}
このようなタグは、オブジェクト内の値がページに直接表示されることを示します。
************************************************* * ***************************
ページまたはクラス内でテンプレート クラス メソッドを呼び出します。
ページまたはクラス内で呼び出すことができます
オブジェクトを生成し、対応するタグ関数解析クラスを関連付けます
// ここでは、この行の後に Business クラス オブジェクトを追加するだけです new Business()
//インターフェースを使用してポリモーフィズムを実装すると、コードは少し面倒に見えます。 自分で使用する場合は、最後の「new Business()」をタグ解析関数を含む独自のクラスに変更するだけです。
ILabelAnalyStart objILabel=(ILabelAnalyStart) new TempletReplet(new Business());
// テンプレートのパス属性を読み取ります。
objILabel.ReadFilePath=this.Server.MapPath("templet/aa1.htm");
// ファイルパス属性を書き込みます
objILabel.WritFilePath=this.Server.MapPath("page/aa1.html");
//データテーブルオブジェクトを取得します。
objILabel.LabelDatatable=ds.Tables[0];
//Hashtable オブジェクトを使用して、このページの変数をテンプレート クラスに渡します。
objILabel.LabelHashtable=ht;
これにより、3 つの置換が実現できます。
// テンプレートの置換と書き込みを開始します
objILabel.LaberReplet();
// 解析結果を返す
文字列 aa=objILabel.LaberRepletText();
// 解析結果を返します。詳細については、RetuenString.cs ファイルを参照してください。
string aa=objILabel.LaberRepletString();
詳細については、これら 3 つのファイルの cs ファイルを参照してください。
WriteArticon.aspx - テンプレートを読み取り、書き込まれたファイルを解析して静的ページを生成するニュース システム
ReturnText.aspx - テンプレート解析を読み取って文字列を返し、それを使用して外観が頻繁に変更されるページを作成します。
スキン変更ページ
RetuenString.aspx - タグ文字列を受け入れ、解析された結果を返します。一般的に ajax で使用されます
********************************************** *******************************
ラベル関数の関連付け:
詳細については、Business.cs ファイルを参照してください。
ロジック層に対応するクラスの静的コンストラクターに、次のコードを追加します。
//静的コンストラクターを呼び出し、タグ実行関数デリゲートを静的ハッシュ テーブルに配置します
//このメソッドは実行する必要があります
静的ビジネス()
{
Business _this=new Business();
FunctionList.objFunctionHashtable.Add("パラメータ ブックマークなし",new KeyItemDelegate(new UserDelegate.Run_0(_this.show),0));
FunctionList.objFunctionHashtable.Add("パラメータ ブックマーク 1 つ",new KeyItemDelegate(new UserDelegate.Run_1(_this.tag),1));
FunctionList.objFunctionHashtable.Add("2 つのパラメーター ブックマーク",new KeyItemDelegate(new UserDelegate.Run_2(_this.tag_two),2));
//ブックマークは実行関数に関連付けられています。これをブックマーク解析クラスの静的コンストラクターに置きます。これは、オブジェクトを毎回実行せずに、メモリ内のオブジェクトを完全に使用するためです。
// 「パラメータブックマーク」文字は public string tag(string aa) 関数に対応し、対応するモードはキーと値をハッシュ テーブルに追加することです。
// ("パラメータのブックマーク",new KeyItemDelegate(new UserDelegate.Run_1(_this.tag),1));
// タグ名 |
// 1 つのパラメーターに Run_1 デリゲートを使用します。 | |
// 対応するタグ実行関数 |
// 1 つのパラメータについては、番号 1 を書き込みます
// 上記の 0 個以上の対応する例
}
詳細については、Business.cs ファイルを参照してください
。 **************************************** * **********************************
タグ内のループの概要:
ネストされていないループは、タグ内でいくつかの特殊なシンボルを使用することで実装できます。
//------------------------------------------------ ------------------------
{$loop(3,0,alter)$} //0 行目から 3 行を表示します。交互の列がある場合は、交互の列を実行します。
{$BlockItem$} //デフォルトのループ行、
<td bgcolor="#33ccff">タイトル:{$dt[5][name]$}、著者:{$One パラメータ:dt[dddf]$}</td>
{$/ブロックアイテム$}
{$BlockAlterItem$} // 行を交互にループする デフォルトの行ラベル ペアがない場合は、代替ループ ラベル ペアが存在します。交互のラベル ペアをデフォルトの行ラベル ペアとして扱います
<td bgcolor="#ff6699">タイトル:{$dt[5][name]$}、著者:{$one パラメータ:dt[dddf]$}</td>
{$/BlockAlterItem$}
{$BlockPatch$} //ループする行数がデータテーブルの行数より大きい場合、ここの内容を使用して表示を補足します。 「補足」タグペアがない場合。表示される行数がデータテーブルの行数よりも大きい場合、データテーブルの行数のみが表示されます。
<td bgcolor="#33ccff">補足(タグ内でも使用可能)</td>
{$/ブロックパッチ$}
{$BlockAlterPatch$} //補足ラベルのペアはありませんが、代替の補足ラベルのペアはあります。交互の補足タグペアを補足タグペアとして扱う
<td bgcolor="#ff6699">代替サプリメント (タグは内部でも使用できます)</td>
{$/BlockAlterPatch$}
{$/loop$} //ループの終了
//------------------------------------------------ ---------------
{$BlockItem$} {$/BlockItem$}: デフォルトのループ行ラベル ペア
{$BlockAlterItem$} {$/BlockAlterItem$} : 行ラベルのペアを交互に循環します
{$BlockPatch$} {$/BlockPatch$}: デフォルトの補助線ラベル ペア
{$BlockAlterPatch$} {$/BlockAlterPatch$}: 行ラベルのペアを交互に補完します
//---------------------------- -- -----------------------
デフォルトのループ行しかない場合は、{$BlockItem$} タグ ペアを追加できません。
のように
{$loop(3,0,alter)$}
<tr><td>{$関数タグ$}</td></tr>
{$/ループ$}
そして
{$loop(3,0,alter)$}
{$BlockItem$}<tr><td>{$function label$}</td></tr>{$/BlockItem$}
{$/ループ$}
つまり同じ効果です
//------------------------------------------------ -------------
{$loop(3,0,alter)$}
{$ブロックオルタパッチ$}
<tr><td>{$関数タグ$}</td></tr>
{$/BlockAlterPatch$}
{$/ループ$}
交互サイクル行ラベル ペアのみが存在し、デフォルトのサイクル行ラベル ペアがない場合、交互サイクル行ラベル ペアは自動的に次のように変換されます。
デフォルトの環状線ラベルペア
//------------------------------------------------ ---------------
{$loop(3,0,alter)$}
{$ブロックオルタパッチ$}
<tr><td>{$関数タグ$}</td></tr>
{$/BlockAlterPatch$}
{$/ループ$}
交互補助線ラベル ペアのみが存在し、デフォルトの補助線ラベル ペアがない場合、交互補助線ラベル ペアは自動的に次のように変換されます。
デフォルトの環状線ラベルペア
************************************************* * **********************
ループパラメータの説明:
{$loop(3,0,alter)$}
ループには 3 つのパラメーターがあり、これらは適切に減らすことができます。
最初のパラメータ:
3: 3 回ループします。すべてをループするわけではありません
2 番目のパラメータ:
2: 2 から開始しても 0 から開始するわけではありません
3 番目のパラメータ:
変更: 代替
noalter: オルタネーションなし 指定がない場合はデフォルトでオルタネーションとなるため、オルタネーションを付けても付けなくても同じです。
3 つのパラメータをすべて省略した場合は、少なくとも 1 組の空の括弧 {$loop()$} を保持する必要があります。
ループ内の行数を表します。
0行目から補足がある場合は補足が表示されます。
************************************************* * *************************
アップデートがありました。主に最適化ループ。
現在、50,000 行のテーブルをループするには 300 ~ 400 ミリ秒かかります。
************************************************* * *************************
テンプレートは 85k を超えないようにすることをお勧めします。また、大きなサイズのオブジェクトになることに注意してください。第 2 世代オブジェクトのページ テンプレートの数は 919 以下にし、対応する関数タグの数は 1597 を超えないようにすることをお勧めします。
私自身の理解に合わせてテンプレート クラスが成長していくのを見るのは嬉しいことです。
************************************************* * ***************************