zoukankan      html  css  js  c++  java
  • 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 GetUserData = (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>
  • 相关阅读:
    日记功能发布
    功能小改进
    CuteEditor 6.0一个很奇怪的Bug
    关于博客园.NET俱乐部的公告
    新功能发布
    建立了一个博客园创业者QQ群
    思想决定生活 《卡耐基成功之道全书》读书笔记
    建立了一个英语学习小组
    实际上我没有选择的余地
    公告
  • 原文地址:https://www.cnblogs.com/kingthy/p/2161039.html
Copyright © 2011-2022 走看看