. (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는 , 이름 은 다음과 같이 자신의 출력 결과가 템플릿 엔진 할당이 최종 출력을 분석 :
본도. < 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 () } |
위의 경우 템플릿 코드 템플릿 엔진이 올바르게 구문 분석 각 변수 표현의 최종 값을 구문 분석 할 수있을 것입니다 사용자 클래스의 인스턴스 변수에 할당 된 값입니다.
클래스 위치 class User |
但在某些情况下,我们需要获取的“值”并不简单地存在变量值的类型中,而是需要经过其它处理运算得出来的值。比如上面的获取个人资料里,我们还要获取用户的个人财产总额,但从上面的代码里可看出个人财产总额项并不存在于User类里,所以导致VT模板引擎根本无法获取此项的值。那我们要如何做才能获取此项数据呢?VT模板引擎提供了一个手动设置变量表达式的值的方法,而我们要做的就是根据此方法手动设置变量表达式的值!例如上面的VT模板代码改为如下:
我叫{$:user.name},今年{$:user.age}岁,我来自{$:user.location.getcity()},我的个人财产总共有{$:user.totalmoney}元。 |
从上面的类实例代码中可知道totalmoney这个项是不存在User的属性/字段列表里的,所以我们就要手动设置{$:user.totalmoney}的值,示例代码如下:
/// <summary> //获取user变量 |
3、有条件的控制数据的输出
在输出数据时,我们并不是简单的输出所有数据,而是要根据外部的许多条件组合获取其中的部分数据。而对于这些外部条件,如果可固定的则我们可以在设计VT模板时将其写入到标签(建议是<vt:template>标签)的属性里,这样我们就能在程序代码里获取到这些外部条件并加以处理数据。
例如博客园的新闻频道里右边的“相关新闻”、“热点新闻”两栏数据,如下图:
假设“相关新闻”里获取的新闻是属于"relating”类型的新闻,而“热点新闻”则是获取属于"hoting”类型的新闻,则我们可以设计其VT模板如下:
<div class="side_block"> <h3 class="title_blue">相关新闻</h3> <vt:template name="topnews" type="relating" file="cnblogs_newsdata.html" /> </div> <div class="side_block"> <h3 class="title_yellow">热点新闻</h3> <vt:template name="topnews" type="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标签) |
在上面代码中使用了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