zoukankan      html  css  js  c++  java
  • (转)vtemplate

    本文转载自:http://www.cnblogs.com/wfnice12/archive/2009/11/03/1594922.html

    1、什么是VTemplate?

    VTemplate是一个免费的开源(采用LGPL开源许可协议)模板引擎,用于解析运行VT模板; 其主要目标是为ASP.Net开发提供另外一种技术选择方案,以保证用简单的语法,良好的结构,不混杂业务逻辑的方式书写页面; 适合于充当Model-View-Controller(MVC)模式应用的View角色,以使能更好的分离页面设计人员与业务开发人员的职责; 也可以作为动态文本生成工具,生成HTML、XML、Mail、程序源代码或其它文本等。

    2、VTemplate模版范例

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
    <title> test1 </title>
    </head>
    <body>
    <vt:for from="1" to="9" index="i">
    <vt:for from="1" to="$i" index="j">
    <vt:expression var="r" args="i" args="j" expression="{0}*{1}" />{$:i}*{$:j}={$:r}&nbsp;&nbsp;&nbsp;&nbsp;
    </vt:for>
    <br />
    </vt:for>
    </body>
    </html>

    以上模版代码经过VTemplate解析运行后将输出一个99乘法表,如下:

    1*1=1    
    2*1=2     2*2=4    
    3*1=3     3*2=6     3*3=9    
    4*1=4     4*2=8     4*3=12     4*4=16    
    5*1=5     5*2=10     5*3=15     5*4=20     5*5=25    
    6*1=6     6*2=12     6*3=18     6*4=24     6*5=30     6*6=36    
    7*1=7     7*2=14     7*3=21     7*4=28     7*5=35     7*6=42     7*7=49    
    8*1=8     8*2=16     8*3=24     8*4=32     8*5=40     8*6=48     8*7=56     8*8=64    
    9*1=9     9*2=18     9*3=27     9*4=36     9*5=45     9*6=54     9*7=63     9*8=72     9*9=81   

    而程序处理代码则只有简单的两行,如下:
    注:假设上面的模版代码存放在test1.html文件上

    TemplateDocument document = new TemplateDocument(Server.MapPath("template/test1.html"), Encoding.UTF8);
    document.Render(Response.Output);

    3、什么是VT模版元素?

    VT模版元素VTemplate模版引擎定义的有特殊作用的模版语言元素,分为标签元素变量元素

    3.1、标签元素都是程序逻辑控制元素,是标准的HTML标签元素,如上例中用于循环处理的<vt:for>标签和用于计算表达式值的<vt:expression>标签等

    3.2、变量元素是数据输出元素,其格式是以“{$:”字符开头,以“}”字符结束。 如上例中的{$:i}、{$:j}和{$:r}等

    4、变量与变量表达式

    4.1、变量是VTemplate模版引擎中的核心元素,用于存储或控制数据的输出,其类似于程序语言中的“变量”概念,定义格式也是一样。如上例中的i,j,r变量。

    4.2、变量表达式则是定义获取变量中某个字段、属性或函数方法结果值。

    定义格式为:“前缀.变量.变量字段/属性/函数方法/索引值”。

    前缀:以#号开头后跟模版块的Id值,用于指示此变量是取自于对应Id的模版块下的变量,如#my.user则表示user变量是取自于Id为my的模版块下的变量;如果省略Id号,即前缀只为#号,则表示是当前模版块下的变量;而如果前缀是“##”,则表示是当前模版块的父模版块(如果不存在父级模版块则为当前模版块)下的变量;如果省略前缀,则表示是文档(根)模版块的变量

    变量字段/属性/函数方法/索引值:表示要从变量中取得数据的字段/属性/函数方法/索引值(数字),其中函数方法只支持不带参数的方法。此段可以定义0次或多次。

    例子:

    #my.user Id为my的模版块下的变量user的值
    #my.user.age Id为my的模版块下的变量user的age属性/字段值
    #my.user.location.getcity() Id为my的模版块下的变量user的location属性/字段值的getcity方法返回的值
    #.user 当前模版块下的变量user的值
    #.user.age.tostring() 当前模版块下的变量user的age属性/字段值的tostring方法返回的值
    ##.user.location.city 当前模版块的父级模版块的变量user的location属性/字段值的city属性/字段的值
    user.age 文档(根)模版块的变量user的age属性/字段值
    weeks.0 文档(根)模版块的变量weeks的0索引位置的值
    #.users.0.name 当前模版块下变量users的0索引位置的值的name字段/属性值

    注:变量表达式可在“变量元素”或“标签元素”的部分属性值中使用。

    5、标签元素

    5.1、<vt:template>模版块标签元素

    此标签用于定义模版块。在VTemplate的模版规范中,变量是基于模版块存在的,同模版块下同名的变量都是引用同一个变量实例,但不同模版块中的同名变量都是互相独立互不影响的。

    标签样例:

    <vt:template id="mytemplate" name="mytemplate">…………………………</vt:template>

    或自闭合的样例:

    <vt:template id="filetemplate" file="include/myfile.html" charset="utf-8" />

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    file 模版块数据文件的路径地址,可以绝对或相对地址
    charset 模版块数据文件的编码,如果未定义则如果存在父级模版块的话则采用父级模版块的编码,否则采用系统默认编码
    render 定义用于处理此模块数据的实例,格式:"类实例,程序集"。如果已定义此属性但未定义rendermethod属性,则类实例必须已实现ITemplateRender接口。(可不定义)
    rendermethod 定义用于处理此模块数据的类实例的方法,此方法必须已标记TemplateRenderMethodAttribute特性。(可不定义)

    5.2、<vt:include>文件包含标签元素

    此标签用于包含外部文件。

    标签样例:

    <vt:include file="include/myfile.html" charset="utf-8">…………………………</vt:include>

    或自闭合的样例:

    <vt:include file="include/myfile.html" charset="utf-8" />

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    file 模版块数据文件的路径地址,可以绝对或相对地址
    charset 模版块数据文件的编码,如果未定义此属性则如果存在父级模版块的话则采用父级模版块的编码,否则采用系统默认编码

    5.3、<vt:for>循环标签元素

    此标签用于定义数据循环,类似于程序语言中的for循环。

    标签样例:

    <vt:for from="1" to="9" index="i">…………………………</vt:for>

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    from 循环起始值,可为一个数值常量(如:1)或变量表达式(必须以$字符开头,如:$i)
    to 循环结束值,可为一个数值常量(如:1)或变量表达式(必须以$字符开头,如:$i)
    step 循环值的步值,可为一个数值常量(如:1)或变量表达式(必须以$字符开头,如:$i),如果未定义此属性,则默认为1
    index 定义存储循环索引值的变量,注:此索引值是一个LoopIndex实例。(可不定义)

    5.4、<vt:foreach>集合数据循环标签元素

    此标签用于定义处理集合数据的循环,类似于程序语言中的foreach循环。

    标签样例:

    <vt:foreach from="users" item="user" index="i">…………………………</vt:foreach>

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    from 变量表达式
    item 定义存储当前循环值的变量。(可不定义)
    index 定义存储循环索引值的变量,注:此索引值是一个LoopIndex实例。(可不定义)
    groupsize

    设置拆分数据集合时的组大小。(可不定义)
    如果定义此属性值,并且值大于1,则模版引擎在解析此foreach标签时,先将from属性定义的变量表达式的结果值折分成一组组集合数据再进行解析。

    例如:from的变量表达式的结果值原是“1,2,3,4,5,6”数组集合,如果groupsize设置为2,则将会拆成"[1,2],[3,4],[5,6]"的数据集合,再用此新的数据集合进行循环解析。

    5.5、<vt:foreachelse>空集合数据循环标签元素

    此标签用于定义当集合数据为空(数量为0)时显示处理的节点。此标签必须在<vt:foreach>标签中定义,并且此标签为单节点标签(即不需要配对的结束标签)。

    标签样例:

    <vt:foreach from="users" item="user" index="i">

    {$:i}、我叫{$:user.name},今年{$:user.age}岁

    <vt:foreachelse />

    没有任何用户

    </vt:foreach>

    注:当users集合数据为空时则显示"没有任何用户"字样,否则不显示此字样。

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)

    5.6、<vt:if>条件判断标签元素

    此标签用于定义数据条件判断,类似于程序语言中的if语句。

    标签样例:

    <vt:if var="user.age" value="20" compare=">">…………………………</vt:if>

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 用于判断条件的变量表达式
    value 用于比较条件的值,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i)
    注:此属性可以多次定义,当var变量表达式中的值和其中一个value属性值匹配时即符合条件。
    compare 比较的方式,可以为以下几种:
    > : 大于
    >= : 大于等于
    < : 小于
    <= : 小于等于
    !=或<> : 不等于
    = 或== : 相等
    如果未定义此属性则表示采用“相等”比较。
    expression 定义需要简单运算的表达式,表达式中支持 “{0}”标记,用于代替var属性的变量表达式的值。(可不定义)

    5.7、<vt:elseif>条件分支判断标签元素

    此标签用于定义数据条件的分支判断。类似于程序语言中的else if语句。此标签可以同时支付一个或多个。此标签只能在<vt:if>标签中定义,并且此标签为单节点标签(即不需要配对的结束标签)。

    标签样例:

    <vt:if var="user.age" value="20">

    20岁用户
    <vt:elseif value="30” />

    30岁用户

    <vt:elseif value="40” />

    40岁用户

    </vt:if>

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 用于判断条件的变量表达式。如果未定义此属性,则为标签所在的<vt:if>标签中的var属性值
    value 用于比较条件的值,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i)
    注:此属性可以多次定义,当var变量表达式中的值和其中一个value属性值匹配时即符合条件。
    compare 比较的方式,可以为以下几种:
    > : 大于
    >= : 大于等于
    < : 小于
    <= : 小于等于
    !=或<> : 不等于
    = 或== : 相等
    如果未定义此属性则表示采用“相等”比较。
    expression 定义需要简单运算的表达式,表达式中支持 “{0}”标记,用于代替var属性的变量表达式的值。(可不定义)

    5.8、<vt:else>条件分支判断标签元素

    此标签用于定义数据条件的分支判断,即当<vt:if>标签中的所有条件分支都条件不成立时用于显示处理的节点。类似于程序语言中的else语句。此标签只能在<vt:if>标签中定义,并且此标签为单节点标签(即不需要配对的结束标签)。

    标签样例:

    <vt:if var="user.age" value="20">

    20岁用户
    <vt:elseif value="30” />

    30岁用户

    <vt:else />

    未知岁数

    </vt:if>

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)

    5.9、<vt:expression>表达式标签元素

    此标签用于对变量表达式进行简单数据运算

    标签样例:

    <vt:expression var="r" args="i" args="j" expression="{0}*{1}" />

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 存储表达式运算结果的变量
    args 参与表达式计算的变量表达式。(可不定义)
    注:此属性可以多次定义,在表达式中分别以{0},{1}表示各个args属性的变量表达式值
    expression 要进行运算的表达式。
    output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

    5.10、<vt:serverdata>服务器数据标签元素

    此标签用于获取服务器的部分数据,如Session、Application、DateTime等等

    标签样例:

    <vt:serverdata var="session" type="session" item="username" />

    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 存储服务器数据的变量
    type

    要获取服务器数据的类型。支持以下几种:

    类型 说明
    Time

    获取服务器时间

    item 属性值可定义为以下值:

    today = 获取今天的日期(不带时间部分)

    yesterday = 获取昨天的日期(不带时间部分)

    tomorrow = 获取明天的日期(不带时间部分)

    其它值 = 获取服务器现在的时间

    Random

    获取一个0---1之间的双精度随机数

    item 属性不需要定义

    Application

    获取服务器当前上下文的HttpApplicationState对象.如果模版引擎不在Web程序上使用则无效

    item 属性值则为Application集合的键值key

    Session

    获取服务器当前上下文的HttpSessionState对象.如果模版引擎不在Web程序上使用则无效

    item 属性值则为Session集合的键值key

    Cache

    获取服务器当前上下文的缓存对象

    item 属性值则为Cache集合的键值key

    QueryString

    获取服务器当前上下文的Request.QueryString数据集合.如果模版引擎不在Web程序上使用则无效

    item 属性值则为Request.QueryString集合的键值key

    Form 获取服务器当前上下文的Request.Form数据集合.如果模版引擎不在Web程序上使用则无效

    item 属性值则为Request.Form集合的键值key

    Cookie

    获取服务器当前上下文的Request.Cookie数据集合.如果模版引擎不在Web程序上使用则无效 

    item 属性值则为Request.Cookie集合的键值key,如果item值包含“.”号,则表示属于某个Cookie下的某个Value值,例如:

    item="user"则表示是Request.Cookie["user"]值;
    item="user.name"则表示是Requst.Cookie["user"]["name"]值

    ServerVariables 获取服务器当前上下文的Request.ServerVariables数据集合.如果模版引擎不在Web程序上使用则无效

    item 属性值则为Request.ServerVariables集合的键值key

    RequestParams 获取服务器当前上下文的Request.Params数据集合.如果模版引擎不在Web程序上使用则无效

    item 属性值则为Request.Params集合的键值key

    Request 获取服务器当前上下文的HttpRequest对象.如果模版引擎不在Web程序上使用则无效

    item 属性不需要定义

    Environment 获取服务器系统平台的环境参数

    item 属性不需要定义

    item 要获取的数据项,此属性值根据type值而具有不同的意义,具体的看上表。
    output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

      

    5.11、<vt:datareader>数据读取标签元素

    此标签用于直接从数据源读取数据
    注意:此标签必须采用TagOpenMode=Full的TemplateDocumentConfig时才允许使用。

    标签样例:

    <vt:datareader var="members" connection="memberdb" commandtext="select * from [member]" />

      
    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 存储返回数据的变量
    connection

    数据源名称.此名称必须已在项目配置文件(如:web.config)里的connectionStrings节点里定义.

    commandtext 数据查询语句(SQL语句) 
    rowindex 要获取行的行号(可不定义)
    注:当此值不定义时将返回一个表结构(DataTable),而如果定义此值,则将返回对应行的数据行(DataRow),如果行不存在则返回null
    parameters

    数据查询语句中的附加参数的变量表达式(可不定义)
    注:此属性可以多次定义,在数据查询语句中分别以@p0,@p1表示各个parameters属性的变量表达式值

    例子:
    <vt:datareader var="members" connection="db" commandtext="select * from [member] where id>=@p0 and sex=@p1" parameters="id" parameters="sex" />

    5.12、<vt:function>函数调用标签元素

    此标签用于直接调用函数标签样例:

    <vt:functionvar="days" method="DaysInMonth" type="System.DateTime" args="2009" args="10" />
    <vt:functionvar="UTCTime" method="ToUniversalTime" type="$time" />

      
    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 存储函数返回值的变量
    method

    函数方法名.

    type 包含静态函数方法的类型或包含函数方法的变量表达式(必须以$字符开头,如:$i)
    args

    参与函数运算的参数,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i) (可不定义)
    注:此属性可以多次定义,但其定义顺序必须与函数方法的参数顺序一致。

    output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

    5.13、<vt:property>获取字段或属性值标签元素

    此标签用于直接获取字段或属性值标签样例:

    <vt:property var="time" field="Now" type="System.DateTime" />
    <vt:property var="year" field="Year" type="$time" />

      
    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 存储字段或属性值的变量
    field

    字段或属性名.

    type 包含静态字段或属性的类型或包含字段或属性的变量表达式(必须以$字符开头,如:$i)
    output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

    5.14、<vt:set>变量赋值标签元素

    此标签用于向模版变量赋值标签样例:

    <vt:set var="time" value="2009-08-09" />
    <vt:set var="time" value="$year" value="$month" value="$day" format="{0}-{1}-{2}" />

      
    标签中已定义的属性列表:

    名称 说明
    id 标签元素的Id,建议唯一但不强制。(可不定义)
    name 标签元素的名称。(可不定义)
    var 需要赋值的变量名
    value

    要赋于变量的值,可为数值/字符串常量或变量表达式(必须以$字符开头,如:$i)
    注:此属性可以多次定义,但如果多次定义则必须定义format属性。

    format 用于格式化变量值的格式。(可不定义)
    注:在格式表达式中分别以{0},{1}表示各个value属性的变量值
    output 是否在解析标签时输出标签的结果值true/false,如果定义此属性且值设为true,则可以不定义var属性(即不存储结果值),默认不输出标签结果值。(可不定义)

    6、变量元素

    变量元素主要用于输出变量表达式的值。其定义格式为:

    {$:变量表达式 属性="属性值"}

    例子:

    {$:i}、{$:user.age format=”00”}、{$:user.name length=”20” htmlencode=”true”}

    {$:#my.i}、{$:##.user.age}、{$:#my.user.location.getcity() htmlencode=”true”}

    元素中已定义的属性列表:

    名称 说明
    htmlencode 输出变量表达式的值时是否需要进行HTML字符编码。true/false,默认为false(可不定义)
    urlencode 输出变量表达式的值时是否需要进行URL字符编码。true/false,默认为false(可不定义)
    xmlencode 输出变量表达式的值时是否需要进行XML字符编码。true/false,默认为false(可不定义)
    textencode 输出变量表达式的值时是否需要进行文本字符编码(先进行HTML字符编码,再将“空格”转换为"&nbsp;”;“回车换行”转换为"<br />”字符)。true/false,默认为false(可不定义)
    jsencode 输出变量表达式的值时是否需要进行Javascript脚本字符编码。true/false,默认为false(可不定义)
    format 用于格式化变量表达式的值的格式(如果变量表达的值已实现IFormattable接口则调用接口方法,否则调用String.Format方法)。(可不定义)
    length 输出变量表达的值时的最大长度。如果值的字符长度超出此定义的值,则将进行字符截取。默认为0不截取(可不定义)
    charset 定义在进行urlencode或length截取字符时采用的编码。默认为所在模版块的charset(可不定义)
    appendtext

    定义文本在输出时如果被裁剪后要附加显示的文本。(可不定义)
    注: 此属性必须和length属性配合使用。

    call 在输出变量表达式的值前需要调用的函数名称。(可不定义)
    注:此属性可以多次定义,模版引擎将根据定义顺序先后调用函数。函数的原型参考VariableFunction委托

    7、注释标签:

         注:注释标签只在2.1以上版本有效

         格式:<!--vt[注释文字]-->

         注释标签在解析输出时不会被输出显示,并且注释里面可以书写任何的标签元素,都不会被VTemplate模版引擎解析。

         例子:

         <!--vt[这是VT的注释代码,下面的标签不会被解析到<vt:serverdata type="time" output="true" />。]-->

    8、项目托管
    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://222.76.217.250:8888/index.ashx

    注:已建立VTemplate模版引擎技术交流QQ群,欢迎各位加入参与项目开发或技术探讨。QQ群:884468

    2、VTemplate模板的特色:

    2.1、VT是一种解释型的模板引擎,所以你可以随时更改你的模板代码以获得不同的输出,而不需要重新编译程序代码
    2.2、VT支持缓存,也就是模板只需要解析一次,下次就可以直接从内存里构建您的模板对象而不需要再次解析模板代码,除非相关的模板文件已被修改。
    2.3、VT的模板标签语法是基于HTML规范定义的元素,所以对页面设计人员来说是非常友好的。
    2.4、VT模板支持循环、条件判断、数值表达式计算等,以方便你在模板里直接进行逻辑处理。

    2.5、VT支持直接调用对象里的方法
    例子:
    ------------模板代码--------------
    <vt:function var="data" method="GetData" type="$user" />
    <vt:set var="data" value="$user.GetData()" />
    ----------------------------------

    上面模板里第一种采用function标签调用user对象的GetData方法,第二种则直接采用变量表达式执行方法。


    2.6、VT可以很灵活的直接获取对象的属性、字段、集合项等数据。
    例子:
    ------------模板代码--------------
    <h4>姓名:{$user.name}</h4>
    ----------------------------------

    上面的变量元素里,user可以为

    public class user{
     public string name;
    }

    也可以为
    public class user{
     public string name{get;set;}
    }

    也可以为
    var user = new Dictionary<string, string>();
    user.Add("name","张三");


    VT会自动判断user对象的name是存在于对象的字段、属性还是集合项里。

    程序传入对象引用看这里:
    <vt:foreach from=”$blogarchive.comments” item=”#.comment” index=”#.floor”>
    
    
      <hr class=”blogsplit”/> 
    
      <div class=”blogcomment”>#{$:#.floor}楼 {$:#.comment.time format=”yyyy-MM-dd HH:mm”} | {$:#.comment.author htmlencode=”true”} </div>
      <div style="padding-left: 20px">{$:#.comment.content htmlencode=”true”}</div>
      </vt:foreach>

    利用我们上面设计好的VT模板,我们实例化VTemplate模板引擎的里的模板文档对象TemplateDocument。

    假如我们的VT模板保存在blogarchive.html文件里,则实例化代码如下:

    TemplateDocument document = new TemplateDocument(context.Server.MapPath("template/blogarchive.html"), Encoding.UTF8);

    或者我们从缓存模板里构造实例:

    TemplateDocument document = TemplateDocument.FromFileCache(context.Server.MapPath("template/blogarchive.html"), Encoding.UTF8);

    到此,我们就可以使用document对象来操作VT模板变量里的元素对象了,比如对VT模板里红色的blogarchive变量赋于某篇博客日记数据,如下:

    //对VT模板里的blogarchive变量赋值 
    document.Variables.SetValue("blogarchive", this.GetBlogArchive());
    注:对于GetBlogArchive()方法,则只是一个获取数据实体的函数,比如从数据库获取的数据实体。

    经过这简单的两步操作,我们就已完成了对VT模板的操作,剩下就是“告诉”模板引擎将数据呈现出来,我们的博客日记页面就做好了;)是不是很简单?

    //输出最终呈现的数据 
    document.Render(context.Response.Output);
  • 相关阅读:
    Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常
    BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
    Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
    Codeforces 316G3 Good Substrings 字符串 SAM
    Codechef CHSIGN Change the Signs(May Challenge 2018) 动态规划
    BZOJ1396 识别子串 字符串 SAM 线段树
    CodeForces 516C Drazil and Park 线段树
    CodeForces 516B Drazil and Tiles 其他
    CodeForces 516A Drazil and Factorial 动态规划
    SPOJ LCS2
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/2381305.html
Copyright © 2011-2022 走看看