zoukankan      html  css  js  c++  java
  • 7,VTemplate模板引擎的使用—Function标签

    原文地址:https://www.cnblogs.com/kingthy/archive/2011/08/31/2161039.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:	emplate	est.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:	emplate	est.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>
  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/yushuo/p/12912553.html
Copyright © 2011-2022 走看看