VTemplate模板引擎的使用--高级篇

简介:

在网站中,经常会有某个栏目的数据在多个页面同时使用到。比如新闻网站或电子商务网站的栏目列表,几乎在很多页面都会显示栏目导航。对于这种多个页面同时使用到的“数据区”在ASP.NET Web Form开发中,经常会将这些“数据区”独立封装为一个个Web控件。那在VTemplate模板引擎里又要如何做呢?在VTemplate模板引擎里,提供了一种“模板块解析器”接口。当VTemplate模板引擎解析并呈现VT模板数据时,如果发现某个<vt:template>标签已定义“模板块解析器”,则会构建此“模板块解析器”实例并将解析权交给“模板块解析器”,等其处理完后再继续解析呈现标签数据。其流程图如下:

vtemplate_snap_doc3_1

 

在<vt:template>标签使用“模板块解析器”,是利用其已定义的两个特殊属性:

名称 说明
render 定义用于处理此模块数据的实例,格式:"类实例,程序集"。如果已定义此属性但未定义rendermethod属性,则类实例必须已实现ITemplateRender接口。(可不定义)
rendermethod 定义用于处理此模块数据的类实例的方法,此方法必须已标记TemplateRenderMethodAttribute特性。(可不定义)

如果是使用ITemplateRender接口来实现“模板块解析器”,则只需要定义render属性;如果用TemplateRenderMethodAttribute特性来实现“模板块解析器”,则必须要定义render和rendermethod方法!

注意:TemplateRenderMethodAttribute特性的优先权最高,即如果同时定义了这两个属性,则不管render定义的类是否已实现ITemplateRender接口都会被忽略不用,而直接使用rendermethod定义的特性方法!

1、ITemplateRender接口。

/// <summary> 
/// 模板块数据的解析处理接口 
/// </summary>
 
public interface ITemplateRender 

    /// <summary> 
    /// 预处理解析模板数据 
    /// </summary> 
    /// <param name="template"></param>
 
    void PreRender(Template template); 
}

从上可知,ITemplateRender接口只有一个声明方法PreRender,用于接收处理VTemplate模板引擎转交过来要进行解析的模板块。

我们将《VTemplate模板引擎的使用--进阶篇》的最后一个例子改一下,用ITemplateRender接口来处理那些新闻列表数据。 
我们先构建一个已实现ITemplateRender接口的类,代码如下:

namespace VTemplate.WebTester.Core
        {
        /// <summary>
        /// 模板块解析器
         /// </summary>
        public class CnblogsNewsRender : ITemplateRender
        {
        #region ITemplateRender 成员
         /// <summary>
        /// 解析某个模板块的数据
         /// </summary>
        /// <param name="template"></param>
        public void PreRender(Template template)
        {
         //根据模板块里定义的type属性条件取得新闻数据
          List<News> newsData = NewsDbProvider.GetNewsData(template.Attributes.GetValue("type"));
        //设置变量newsdata的值
         template.Variables.SetValue("newsdata", newsData);
        //取得模板块下Id为newslist的标签(也即是在cnblogs_newsdata.html文件中定义的foreach标签)
        Tag tag = template.GetChildTagById("newslist");
        if (tag is ForEachTag)
        {
        //如果标签为foreach标签则设置其BeforeRender事件用于设置变量表达式{$:#.news.url}的值
        tag.BeforeRender += (sender, e) =>
        {
        ForEachTag t = (ForEachTag)sender;
        //取得当前项的值(因为foreach标签的数据源是List<News>集合,所以当前项的值类型为News实体)
        News news = (News)t.Item.Value;
        //设置当前项的变量表达式的值.也即是"{$:#.news.url}"变量表达式
        t.Item.SetExpValue("url", NewsDbProvider.GetNewsUrl(news));
        //当新闻不可见时.你可以取消本次输出
        if (!news.Visible) e.Cancel = true;
        };
        }
        }
        #endregion
        }
        }

这样我们就构造了一个“模板块解析器”,在VT模板里就可以直接使用了,如下:

<div class="side_block"> 
  <h3 class="title_blue">相关新闻</h3> 
  <vt:template name="topnewstype="relating" file="cnblogs_newsdata.html" render="VTemplate.WebTester.Core.CnblogsNewsRender,VTemplate.WebTester" /> 
</div> 
<div class="side_block"> 
  <h3 class="title_yellow">热点新闻</h3> 
  <vt:template name="topnewstype="hoting" file="cnblogs_newsdata.html" render="VTemplate.WebTester.Core.CnblogsNewsRender,VTemplate.WebTester" /> 
</div>

具体的示例代码,请参考:http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/templaterender_test.ashx.cs

 

2、TemplateRenderMethodAttribute特性方法

TemplateRenderMethodAttribute特性方法的原形和ITemplateRender接口的PreRender差不多,即只能有一个参数,用于接收VTemplate模板引擎转交过来要进行解析的模板块对象。如下面例子代码:

/// <summary>
        /// 解析某个模板块的数据
        /// </summary>
        /// <param name="template"></param>
        [TemplateRenderMethod(Description="解析新闻列表数据")]
        public void RenderNews(Template template)
        {
}

而VT模板代码就需要定义<vt:template>的rendermethod属性,并且定义的值必须和类代码中的方法名一致,如下面例子代码:

<div class="side_block"> 
  <h3 class="title_blue">相关新闻</h3> 
  <vt:template name="topnewstype="relating" file="cnblogs_newsdata.html" render="VTemplate.WebTester.Core.CnblogsNewsRenderMethod,VTemplate.WebTester" rendermethod="RenderNews" /> 
</div> 
<div class="side_block"> 
  <h3 class="title_yellow">热点新闻</h3> 
  <vt:template name="topnewstype="hoting" file="cnblogs_newsdata.html" render="VTemplate.WebTester.Core.CnblogsNewsRenderMethod,VTemplate.WebTester" rendermethod="RenderNews" /> 
</div>

具体的示例代码,请参考:http://net-vtemplate.googlecode.com/svn/src/VTemplate.WebTester/templaterendermethod_test.ashx.cs 

TemplateRenderMethodAttribute特性方法与ITemplateRender接口比较,它的好处就是可在一个类实例中定义多个方法用于处理不同的模板块,也即是说可在一个类实例里定义多个“模板块解析器”。

 

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://61.155.39.222:8888/index.ashx

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


本文转自Kingthy博客园博客,原文链接:http://www.cnblogs.com/kingthy/archive/2009/09/04/net-vtemplate-doc-4.html,如需转载请自行联系原作者

相关文章
|
数据采集 监控 搜索推荐
电商关键词研究:数据收集挑战与解决方案
关键词研究的重要性 深入的研究可以为卖家提供以下信息: 竞争对手数据; 内容营销的点子; 消费趋势; 客户的需求。
|
数据可视化 物联网 Swift
谷歌发布开源LLM Gemma,魔搭社区评测+最佳实践教程来啦!
Gemma是由Google推出的一系列轻量级、先进的开源模型,他们是基于 Google Gemini 模型的研究和技术而构建。
|
网络协议 API C#
C# 中模拟 POST 和 GET 请求的原理与实践
【1月更文挑战第4天】在现代网络应用中,HTTP请求是客户端与服务器交互的基础。其中,GET和POST是最常用的两种请求方法。本文将介绍如何使用C#语言模拟这两种请求,并解释其背后的工作原理。我们将利用.NET框架中的HttpClient类来发送请求,并处理服务器的响应。通过本文,读者将能够理解HTTP请求的基本构成,学会在C#中编写代码来模拟这些请求,进而在开发过程中实现与Web服务的交互。
|
运维 负载均衡 网络协议
从底层技术来看,GSLB 究竟难在哪儿
本文作者吕宏利来自硅谷的SRE,有着多年的国内外大型互联网公司运维开发经验,专注于分布式系统设计、监控、容量规划,数据中心技术以及生产环境的最佳实践。在本文中他将他将向读者介绍什么是GSLB,以及实现细节和维护方法。
8967 0
|
安全 Shell 网络安全
【服务器】Xshell与Xftp软件的使用指南
【服务器】Xshell与Xftp软件的使用指南
1433 0
|
机器学习/深度学习 数据采集 监控
基于YOLOv8的路面缝隙精准识别项目【完整源码数据集+PyQt5界面+完整训练流程+开箱即用!】
这是一套基于YOLOv8的路面裂缝精准识别项目,集成图形化界面(PyQt5)与完整训练流程,支持图片、视频、文件夹及摄像头多种输入方式,开箱即用。系统包含裂缝检测模型、数据集、训练代码和GUI工具,实现从训练到部署的一站式解决方案。核心优势包括高精度检测(mAP超90%)、友好的操作界面、灵活的部署方式,适合高校科研、工程实践及毕业设计。资源包含源码、预训练权重与标注数据,助力快速上手!
|
JavaScript 前端开发
在Vue2或Vue3中项目中使用 Isotope(同位素) 过滤和排序神奇的布局神器,全网独家实现!
本文介绍了在Vue2或Vue3项目中如何使用Isotope(同位素)布局库来创建动态的网格布局,并提供了详细的代码实现和效果展示,包括过滤和排序功能。
302 0
在Vue2或Vue3中项目中使用 Isotope(同位素) 过滤和排序神奇的布局神器,全网独家实现!
ly~
|
存储 安全 生物认证
如何防止密码重用?
本文介绍了防止密码重用的综合措施,包括用户教育与意识提升、技术手段支持和系统设计与策略引导。通过定期的安全培训、安全提示与宣传,增强用户的安全意识;推荐使用密码管理器和账户关联检测技术,帮助用户管理复杂密码;实施多因素身份验证和密码强度检查,确保系统的安全性。
ly~
435 5
|
Java 计算机视觉 Python
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进1】
我的自描外挂制作日志——FPS类游戏的自瞄【优化改进1】
485 1