VTemplateテンプレートエンジンを使用する - 高度な記事を

1、< :VTテンプレート <>と:VT含む異なる>タグ

< VT:テンプレート >と< VT:含ま >これら2つのラベルは、これら2つのラベルは非常に似ていること、ファイル属性が設定され、最終結果は、ファイルの内容が含まれている場合、タグは、ファイルの属性が含まれています。しかし、テンプレートエンジンのためにそれらの間の差が非常に大きいです。

< VT:テンプレート >タグは、ラベル「ダイプレート」で、それは、独自の「変数」を持って、それは「ホストテンプレート」タグ、内部に(なりますOwnerTemplate)。< VT:含める >ファイルの内容は、単にその中にそれ、「ホストテンプレート」タグが含まれますし、それは同じです。

今すぐテンプレートファイルVTがあれば:  inc_content.html

私は、変数$を含むファイルにあった{:#.var1 }。 
私は、foreachのタグ内のファイルを含める: 
< VT:foreachの  =から"$ #.names "アイテムを= " #。名前は "インデックス= " #。私は "> 
ファイル最初の$含ま{:#.I }名前を$ {:#.nameの }。 
</ VT:foreachの >

今それぞれ< VT:テンプレート >と< VT:含める >タグファイル上を含むように、次のように 

A、 < VT:テンプレート >でした:

{:私は、変数$の外だった#.var1 }。 
:私は、foreachのタグの外側にあった 
< VT:foreachの  = "$から#.names "商品= "#。 "インデックス= "#1。I "> 
の外側{$:#.I } {$名:.nameの# }。 
</ VT:foreachの
< VT:テンプレート  ID =ファイル= "inc_content.html" "INCがあります" />


B、 < VT:含める >前記

{:私は、変数$の外だった#.var1 }。 
:私は、foreachのタグの外側にあった 
< VT:foreachの  = "$から#.names "商品= "#。 "インデックス= "#1。I "> 
の外側{$:#.I } {$名:.nameの# }。 
</ VT:foreachの
< VT:含ま  IDを=ファイル= "inc_content.html" "INCがあります" />


上記の二つのVTテンプレートコードは非常に似ていますが、Aが解析された後にvar1と、このINC < VT:テンプレート >型枠パネルの下に変数var1を互いに独立して個別に存在し、!そして、B変数VAR1このINC < VT:含める >変数はVAR1 、(他の変数と同様に)同じ変数への参照をすべて等しいです。

今、A場合、Bは、以下の手順で処理することにより、2のVTテンプレートコードは、次のとおり

この .Document.Variables.SetValue( " VAR1 "、1); 
この .Document.Variables.SetValue( " 名前 "、  新たな文字列は [] { "张三"、 "李四"、 "王五"})。


それがあるだけで、外部変数VAR1以下のようにテンプレートエンジンによって割り当てられ、最終的な出力を解析し、その出力結果は以下のとおりです。 
vtemplate_3_snap_1

図から見ると、。< VT:テンプレート >がデータ出力が含まれていない、として< VT:インクルードには >は、データと同じ外部データと出力が含まれています!そうすることができます< VT:テンプレート >プログラミング言語としてタグクラスは、それが独自の変数、同じ名前のその内部変数には影響しません外部変数の値を変更し、外側のラベルは、そのIDによって得ることができるがあります内部変数

:コードの特定の例は、を参照http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/template_include_test.ashx.cs

 

 

2、変数式の使用

変数式のタグ属性で使用可能な変数の要素でも使用することができます。その役割は、フィールド変数、プロパティ、メソッド、またはインデックスを求める関数の結果値です。例示的な実施形態では#1 .var1は、すなわち、値「1」変数VAR1の値を得ることが記載されています

変数値のタイプの実、プロパティまたは関数法、結果の値を反映させて取得したVTテンプレートエンジンの分野、例えば、VTテンプレートコード:

私の名前は$です{:ユーザー名前 }、今年、$ {:ユーザー年齢 }歳、私は$出身{:ユーザーLOCATIONGetCity() }


もし上記のテンプレートコードテンプレートエンジンを正しく構文解析各可変式の最終的な値を解析することができるであろうユーザークラスのインスタンス変数に割り当てられた値。

クラス・ ロケーション 
{    
    パブリック文字列  GetCity(){ 
         //ここにコード 
    } 
}

class User 

    public string Name { get; set; } 
    public int Age { get; set; } 
    public Location Location { get; set; } 
}

但在某些情况下,我们需要获取的“值”并不简单地存在变量值的类型中,而是需要经过其它处理运算得出来的值。比如上面的获取个人资料里,我们还要获取用户的个人财产总额,但从上面的代码里可看出个人财产总额项并不存在于User类里,所以导致VT模板引擎根本无法获取此项的值。那我们要如何做才能获取此项数据呢?VT模板引擎提供了一个手动设置变量表达式的值的方法,而我们要做的就是根据此方法手动设置变量表达式的值!例如上面的VT模板代码改为如下:

我叫{$:user.name},今年{$:user.age}岁,我来自{$:user.location.getcity()},我的个人财产总共有{$:user.totalmoney}元。

从上面的类实例代码中可知道totalmoney这个项是不存在User的属性/字段列表里的,所以我们就要手动设置{$:user.totalmoney}的值,示例代码如下:

/// <summary> 
/// 返回某个用户的个人财产总额 
/// </summary> 
/// <param name="user"></param> 
/// <returns></returns>
 
static int GetUserTotalMoney(User user) 

    //code here 


//------------------------使用代码----------------------------------------//

//获取user变量 
Variable userVar = this.Document.Variables["user"]; 
//生成User实例 
User user = new User(); 
//…………其它代码略去…………// 
//设置user变量的值为User实例 
userVar.Value = user; 
//手动设置totalmoney的值(注意,这行和上面那行的顺序不能搞乱) 
userVar.SetExpValue("totalmoney", GetUserTotalMoney(user));

 

 

3、有条件的控制数据的输出

在输出数据时,我们并不是简单的输出所有数据,而是要根据外部的许多条件组合获取其中的部分数据。而对于这些外部条件,如果可固定的则我们可以在设计VT模板时将其写入到标签(建议是<vt:template>标签)的属性里,这样我们就能在程序代码里获取到这些外部条件并加以处理数据

例如博客园的新闻频道里右边的“相关新闻”、“热点新闻”两栏数据,如下图:

vtemplate_3_snap_2

假设“相关新闻”里获取的新闻是属于"relating”类型的新闻,而“热点新闻”则是获取属于"hoting”类型的新闻,则我们可以设计其VT模板如下:

<div class="side_block"> 
  <h3 class="title_blue">相关新闻</h3> 
  <vt:template name="topnewstype="relating" file="cnblogs_newsdata.html" /> 
</div> 
<div class="side_block"> 
  <h3 class="title_yellow">热点新闻</h3> 
  <vt:template name="topnewstype="hoting" file="cnblogs_newsdata.html" /> 
</div>

在上面的VT模板中,定义了两个name为"topnews”的<vt:template>标签,这是为了便于在代码里对这两个<vt:template>进行统一处理(因为它们要处理的数据都是相同,只是获取数据条件不同)而定义的名称。并且分别定义了自定义属性type用于做数据获取条件。其中包含文件cnblogs_newsdata.html的VT模板如下:

<ul class="topnews block_list bt"> 
  <vt:foreach from="$#.newsdata" item="#.news" index="#.i" id="newslist"> 
  <li> 
    <a href="{$:#.news.url}" title="{$:#.news.title htmlencode='true'}">{$:#.news.title htmlencode='true'}...</a> 
  </li> 
  </vt:foreach
</ul>

在此文件的VT模板中,定义了一个id为"newslist"的<vt:foreach>标签,定义此id是为了在程序代码里控制新闻的输出和处理每条新闻的访问地址,也即是"{$:#.news.url}”变量表达式的值。

示例代码:

//获取所有名称为topnews的模板块 
ElementCollection<Template> templates = this.Document.GetChildTemplatesByName("topnews"); 
foreach (Template template in templates) 

    //根据模板块里定义的type属性条件取得新闻数据 
    List<News> newsData = GetNewsData(template.Attributes.GetValue("type")); 
    //设置变量newsdata的值 
    template.Variables.SetValue("newsdata", newsData);

    //取得模板块下Id为newslist的标签(也即是在cnblogs_newsdata.html文件中定义的foreach标签) 
    Tag tag = template.GetChildTagById("newslist"); 
    if (tag is ForEachTag
    { 
        //如果标签为foreach标签则设置其BeforeRender事件用于设置变量表达式{$:#.news.url}的值 
        tag.BeforeRender += (sender, e) => 
        { 
            ForEachTag t = (ForEachTag)sender; 
            //取得当前项的值(因为foreach标签的数据源是List<News>集合,所以当前项的值类型为News实体) 
            News news = (News)t.Item.Value; 
            //设置当前项的变量表达式的值.也即是"{$:#.news.url}"变量表达式 
            t.Item.SetExpValue("url", GetNewsUrl(news)); 
        }; 
    } 
}

在上面代码中使用了BeforeRender事件,此事件是在标签元素的数据呈现之前触发。对于循环元素<vt:foreach>和<vt:for>,因为每次循环时都会呈现数据,也就导致每次循环时都会触发此事件(包括AfterRender事件),所以我们就可通过此事件方法获取到循环当前项的值。

具体的示例代码,请参考:http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/cnblogs_newslist.ashx.cs

 

VTemplate项目托管在Google code上。 
URL: http://net-vtemplate.googlecode.com/ 
SVN: http://net-vtemplate.googlecode.com/svn/src/VTemplate.Engine/

更多例子请参考VTemplate.WebTester项目

http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/

 

或观看在线演示例子:(感谢网友“DOLT”、疯子” 提供

http://61.155.39.222:8888/index.ashx

 

注:テンプレートエンジン技術は、追加を探索するプロジェクト開発や技術に参加するためにあなたのすべてを歓迎するために、VTemplate交換QQグループを確立してきました。QQグループ:884 468

おすすめ

転載: www.cnblogs.com/Jeely/p/11346344.html