VTemplate模板引擎的使用—Function标签

简介:

了解或者认识VTemplate:

VTemplate也被网友们简称VT,它是一个基于.net里的模板引擎。

http://www.cnblogs.com/kingthy/archive/2009/08/17/net-vtemplate.html

 

现在让我们了解一下VT里最常用的function标签。

 

Function标签

其定义格式:

<vt:function var="变量" method="方法名" type="类型或实例变量" args="参数" output="true/false" />

它的作用即是在VT里调用某个方法并将返回值赋给某个变量(定义了var的情况)。

 

假设我们现有这样的一个类定义

namespace Test
{
    public class Db
    {
        public DataTable GetData()
        {
            //这里是详细的代码
        }

        public DataTable GetDataByName(string name)
        {
            //这里详细的代码
        }

        public static DataTable GetDbData()
        {
            //这里是详细的代码
        }
    }
}

现在我们要调用其定义的方法。

 

静态方法的调用

在我们的程序代码里,如果要调用上面类的GetDbData静态方法,我们一般这样写(完整写法)

var data = Test.Db.GetDbData();

而将上面的语句转成VT的模板标签后,就需要写成这样的function标签

 

<vt:function var="data" method="GetDbData" type="Test.Db" />

 

也就是function标签里的type属性我们需要写Db类的完整定义路径。

 

实例方法的调用

在我们的程序代码里,如果要调用类实现的方法,我们一般这样写

var db = new Db();
var data = db.GetData();
 

而将上面代码转成VT的模板标签后,我们的function标签就是这样写

 

<vt:function var="data" method="GetData" type="$db" />
 

function标签里的type属性我们写为“$db”,这就表示,我们调用的方法是“db”这个变量的实例方法。

但这个变量是从哪里来呢?这个变量也是同程序代码里一样,也是需要你在VT里对其赋值,比如下面的示例代码:

TemplateDocument document = TemplateDocument.FromFileCache(@"c:\template\test.html", Encoding.UTF8);
            document.SetValue("db", new Db());

 

上面代码里我们调用了SetValue方法,将“db”这个变量赋值到了VT模板里,这样模板里就可以调用此变量的值或方法了。

 

带参数的方法调用

如上面Db类里的GetDataByName方法,在程序代码里我们一般这样写

var db = new Db();
            var data = db.GetDataByName("car");

 

而对于带参数的方法,在VT模板里,我们就可以使用function标签里的args属性,如下面

<vt:function var="data" method="GetDataByName" type="$db" args="car" />

 

而如果我们的参数不是一个常量值,而是一个变量值,我们也可以在args属性里调用,如下面

<vt:function var="data" method="GetDataByName" type="$db" args="$name" />

 

但name变量也是需要赋值才可以使用(如通过SetValue方法),并且类型要一致,如果不一致,VT引擎将会尝试转换类型,如果类型转换成功则执行方法,如果失败将不会执行方法!!(参数类型不匹配时,因为会尝试转换,所以这里的效率会非常低,请尽量避免)

 

如果我们的方法里有多个参数,我们可以通过定义多个args属性,但要注意它们的定义顺序是同方法的参数定义顺序一样的。如下面的示例

public DataTable GetDataBy(string name, int category)
{
    //这里详细的代码
}

VT里的function标签我们就可以写成这样

<vt:function var="data" method="GetDataBy" type="$db" args="car" args="1" />

 

 

参数的自定义

上面的例子里,如果我们的方法参数非常多,用args定义是可以做到,但是却非常的不直观,并且如果参数定义的顺序或类型一错,将会导致我们的方法无法正确执行!如果能换一种方式,比如下面这样的定义

<vt:function var="data" method="GetDataBy" type="$db" pName="car" pCategory="1" />

这样我们的模板代码看起来就非常的直观明了。

 

VT模板里允许在标签里添加自定义属性,所以我们上面的标签定义是符合格式的,但是我们为了能使自定义属性当作参数使用,我们就需要改写GetDataBy方法,如下

public DataTable GetDataBy()
{
    var document = TemplateDocument.CurrentRenderingDocument;
    var tag = document == null ? null : document.CurrentRenderingTag;
    if (tag == null) return null;

    var name = tag.Attributes.GetValue("pName");
    var category = tag.Attributes.GetValue("pCategory").As<int>(0);

    //这里是详细的代码

}

GetDataBy方法变成了无参数方法,并在方法里我们调用了“TemplateDocument.CurrentRenderingDocument”获取当前正在呈现解析数据的模板文档对象,再通过“document.CurrentRenderingTag”获取当前呈现解析数据的模板标签对象。如果我们的GetDataBy方法是通过上面的function标签调用执行的,则“document.CurrentRenderingTag”获取到的标签对象就是此function标签,所以我们可以获取此标签里的所有自定义属性值,从而得到pName与pCategory里定义的值。

注:各个模板标签都有自己的关键属性,这些是无法在自定义属性里获取的,比如"id“、“name“这些是不能用做自定义属性的。

 

 

用户自定义方法

如果我们有些方法是私有的,比如

private DataTable GetUserData(object[] o)
{

}

或者匿名方法

UserDefinedFunction  = (o) =>
{
    //这里是详细的处理代码
};

对于这两种情况,我们是无法直接通过function标签调用的,因为我们无法写type属性!因为type属性需要类名或者是类实例变量,并且是只能调用公开方法

 

而对于这两种情况,则我们需要先在模板里注册用户自定义函数,才能通过function标签调用。如下示例

TemplateDocument document = TemplateDocument.FromFileCache(@"c:\template\test.html", Encoding.UTF8);
document.RegisterGlobalFunction("GetUserData", GetUserData);

注册了自定义函数后,我们就可以写无type属性的function标签,如下

<vt:function var="data" method="GetUserData" />

 

VT在处理这种没有type属性的方法时,将会在“自定义函数”列表里查找同名的方法,如果找到则执行方法,否则不处理。

 

小提示

对于无参数的实例方法,可以直接在变量表达式里执行,所以在任意标签里可直接使用,不一定需要通过function标签执行,如下面示例

<vt:set var="data" value="$db.GetData()" />
<vt:foreach from="$db.GetData()" item="data">.......</vt:foreach>
本文转自Kingthy博客园博客,原文链接:http://www.cnblogs.com/kingthy/archive/2011/08/31/2161039.html ,如需转载请自行联系原作者
相关文章
|
存储 Cloud Native Linux
C++Qt 获取互联网时间
C++Qt 获取互联网时间
|
5月前
|
文字识别 BI
【工具教程】批量PDF和图片OCR识别指定区域文字自动改图片名字,多个区域一次性批量识别改名批量重命名
本内容介绍了一款用于企业档案、医院病历及办公文件管理的图片和PDF文字识别工具。通过框选识别区域,软件可批量提取关键信息,实现文件重命名或导出为表格,极大提升管理效率。支持图片与PDF两种模式,操作简单,适用于合同、病历、报告等场景。提供详细步骤指导,包含区域设置、文件导入、批量处理及结果校验等功能。
737 8
|
11月前
|
分布式计算 大数据 Linux
大数据体系知识学习(二):WordCount案例实现及错误总结
这篇文章介绍了如何使用PySpark进行WordCount操作,包括环境配置、代码实现、运行结果和遇到的错误。作者在运行过程中遇到了Py4JJavaError和JAVA_HOME未设置的问题,并通过导入findspark初始化和设置环境变量解决了这些问题。文章还讨论了groupByKey和reduceByKey的区别。
181 1
|
Ubuntu Linux
内核实验(六):使用misc框架,实现简单字符设备驱动
本文介绍了如何使用Linux的misc框架来实现一个简单的字符设备驱动程序,包括编写驱动源码、编译、部署以及在Qemu虚拟机中测试驱动程序,展示了如何动态分配次设备号并手动创建设备文件以进行测试。
263 0
内核实验(六):使用misc框架,实现简单字符设备驱动
|
存储 关系型数据库 MySQL
索引的威力--记一次MySQL存储过程优化
在MySQL存储过程中,一个`INSERT INTO SELECT`语句起初执行超过130秒,优化后,执行时间降低到1秒内,实现了100倍的性能提升。问题在于`NOT IN`子查询导致的慢查询,最终通过创建单列索引获得了最佳效果。文章还介绍了索引创建的基本语法,并讨论了单列索引与组合索引的优缺点。作者强调,随着数据量增加,索引对于查询性能的重要性,计划未来采用读写分离来进一步优化处理大量插入和查询的场景。
356 0
|
存储 应用服务中间件 Apache
网站空间与服务器,有什么关系和区别
关系在于,网站空间通常位于服务器上,服务器提供了访问这些空间的路径。而区别在于,服务器不仅提供存储,还处理和响应用户请求,而网站空间主要关注的是存储网站的文件和数据。
315 0
|
监控 安全 数据挖掘
【HW前知识库储备】2020HW攻防演练总结:安全数据分析
【HW前知识库储备】2020HW攻防演练总结:安全数据分析
1411 0
|
数据可视化 Python
python+Django+Mysql+Echarts数据可视化实战教程(1):Django环境部署
python+Django+Mysql+Echarts数据可视化实战教程(1):Django环境部署
724 0
|
机器学习/深度学习 数据建模 数据挖掘
python机器学习数据建模与分析——pandas中常用函数总结
本文主要对数据建模与分析中常使用到的pandas内置函数进行总结分析,以此来熟悉数据建模与分析的流程。
506 0
python机器学习数据建模与分析——pandas中常用函数总结
|
SQL 存储 监控
MySQL数据库安全性考虑:预防SQL注入漏洞
随着互联网的快速发展,数据库成为了现代应用程序中的重要组成部分。而在数据库的使用过程中,安全性一直是一个重要的关注点。SQL注入漏洞(SQL Injection)是一种常见的数据库安全漏洞,攻击者可以通过在应用程序的用户输入参数中注入恶意的SQL代码,从而获得对数据库的未授权访问权限。为了保护MySQL数据库免受SQL注入漏洞的威胁,以下是一些预防SQL注入漏洞的安全性考虑。