
| [原创]网鸟asp.net模板引擎v2中的变量标记 |
| 更新时间:2009-12-31 0:00:00 |
|
模板引擎这个概念,也不需要再阐述了,其实,如何对模板引擎下个定义,我也不了解。但无论如何,也不管是在asp、php、jsp抑或是asp.net,甚至是javascript当中(嘿嘿,在javascript里面也有类似于模板引擎的东东),模板引擎当中都少不了“变量标记”这么个东东。
网鸟asp.net模板引擎v2当中约定的模板变量标记有两种形式,一种是动态变量标记(格式为“{$...$}”),一种是静态变量标记(格式为“{#...#}”)。其中,动态变量标记就是用于在代码执行的时候,动态生成我们需要的内容的;而静态变量标记是相对于前者来说的,它是在模板代码被模板引擎提供程序解析的过程当中直接生成为需要的内容的,在生成的代码实际运行过程中,这些“标记”的“内容”是不会改变的,因为它们已经被替换成了最终内容。也许您看了这段文字仍然不了解这是什么意思,我建议您下载网鸟asp.net模板引擎v2的源代码亲自测试一番。 二、使用模板变量标记是实现多层开发的进一步需求。我这里说多层开发而不是简单的mvc,是因为似乎只有多层开发这个概念才能描述出我下面举例的情况。多层开发不一定是mvc,但大多数多层开发模式都可以被看作mvc。 假如,有一个项目要求实现多语言,但这个项目还要要求降低维护成本,使用相同的模板。那么你如何做?是的,我们需要将需要转换为多语言的部分看作为语言包,将这些语言包分离出来独立管理维护,既实现了多语言,也降低了后期的维护成本,并且可以在同一个模板当中任意切换语言类型。 当你将语言包独立出来之后,就发现,我们必须寻找一种方法,让我们的语言包中的条目准确无误的输出到指定的位置,因为我们需要它出现在那里!怎么办?——对了,还是标记!我们约定一种标记格式,用这些标记来表示我们的语言包当中的项,在执行的时候替换它们。这样,我们只需要控制好这些标记的位置,保证它们是准确无误的,就完全可以达到目的了。不是么? 这里还是要提一下网鸟asp.net模板引擎v2当中所设计的静态变量标记了。我们在对模板引擎代码进行后期整理的时候发现,语言包这个东东,实际上在模板生成之后很少去切换它,如果让它们也在运行时当中反复的被运算、解析着,是不是有点浪费资源呢?所以我们又设计了这种叫做静态变量标记的东东,它可以满足这种需求,将某些预先定义的变量,直接替换为最终内容,避免在运行时当中重复运算。 当然,网鸟asp.net模板引擎v2静态变量标记并不仅仅用在语言包上(如果你需要经常切换语言包,请不要使用静态变量标记),还有很多地方需要用它,用心体会吧! 最后,我们来谈谈网鸟asp.net模板引擎v2中模板变量标记的使用。 一、动态变量标记的使用 动态变量标记用起来具有很高的自由度。大家都了解,c#当中所有的类型的基类型都是object,也就是说在c#当中,只要你输入了一段代码它就是类型。那么,在网鸟asp.net模板引擎v2当中,动态变量标记允许你访问任何类型的公开成员,及其子类型(成员所属的类型的成员)的公开成员。只要你拥有访问权限,就可以访问指定类型的任何成员。 使用动态变量标记的一般格式是:{$...$} 在举例之前,我们先假定了一个类型如下:
二、静态变量标记的使用 静态变量标记的使用相对来说非常简单,因为在当前情况下,我们也没有将它设计的很复杂,模板引擎提供程序内部存储静态变量的方式是使用一个字符串字典,在{#...#}当中指定的内容就是这个字典的键名,模板引擎提供程序通过这个键名查询到对应的值并输出。 静态变量标记当中无法像动态变量标记那样可以任意调用指定类型的方法、属性、字段、索引器等,以及它们的子类型的成员,因为它只是一个字典! 在这里,我们也非常期盼着c#4.0正式版的发布,获取它提供的动态方法对我们的模板引擎的改进有很大的帮助。再说一次,在当前开发环境下不是实现不了访问未知类型的成员,只是那样做会增加模板引擎自身架构的难度,目前我们没有考虑要这么做。 在使用静态变量标记之前,我们必须将要访问到的静态变量的键和值输入到模板引擎提供程序当中,示例代码如下:
|












