VTemplate 템플릿 엔진을 사용 - 고급 기사

. (1) < : VT 템플릿 <>와 : VT가 포함 태그를 다른>

< VT : 템플릿 >와 < VT : (가) 포함 >이 두 개의 레이블이 두 개의 레이블이 매우 유사 것으로, 파일의 속성을 설정하고, 최종 결과는 파일의 내용이 포함 된 경우 태그, 파일 특성이 포함되어 있습니다. 그러나 템플릿 엔진 그들 사이의 차이가 매우 큰 것입니다.

< 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 ."항목 = "#의 이름 ."인덱스 = "#의 I "> 
외부 {$ : # .I }는 {$ 이름 : .name을 # }. 
</ VT : foreach는
< VT : 템플릿  ID = 파일 = "inc_content.html ''INC는"/>


B, < VT 다음을 포함 > 상기

내가 변수 $의를 벗어난 {: # .var1 }. 
나는 foreach는 태그를 벗어난 : 
< VT : foreach는  =에서 "$ # .names ."항목 = "#의 이름 ."인덱스 = "#의 I "> 
외부 {$ : # .I }는 {$ 이름 : .name을 # }. 
</ VT : foreach는
< VT : 인클루드  ID를 = 파일 = "inc_content.html ''INC는"/>


위의 두 VT 템플릿 코드는 매우 비슷하지만, 구문 분석 후 VAR1 이 INC < VT : 템플릿 > 거푸집 패널에서 변수 var1에 서로 독립적으로 개별적으로 존재! B 및 변수 VAR1 이 INC < VT 다음이 포함 > 변수 VAR1 동일 (다른 변수와 유사 함) 같은 변수에 대한 모든 참조.

이제, 경우, 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 가변 식의 사용

가변 식 태그 속성에 사용할 수는 가변 요소에 사용할 수 있습니다. 그 역할은 필드 변수, 특성, 방법, 또는 인덱스를 얻기위한 함수의 결과 값이다. 예시적인 실시 예에서 #의 .var1는 , 즉, 값 "1"을 변수 VAR1의 값을 구하는 설명

변수 값 유형에 대한 실제 속성 또는 기능에있어서의 필드 VT 템플릿 엔진 결과의 값을 반영하여 획득 된 , 예를 들어, VT 템플릿 코드 :

내 이름은 $입니다 {: 사용자 . 이름 }, 해, $ {: 사용자 . 나이 } 년 된, 나는 $에서 왔어요 {: 사용자 . LOCATION . GetCity () }


위의 경우 템플릿 코드 템플릿 엔진이 올바르게 구문 분석 각 변수 표현의 최종 값을 구문 분석 할 수있을 것입니다 사용자 클래스의 인스턴스 변수에 할당 된 값입니다.

클래스  위치 
{    
    공공 문자열  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