.NET中的模板引擎技术——StringTemplate(st(or HTML)模板+ASP.NET页...|.Net开发|码途山海.智隐长卷 -

程序人生|重庆纽新

找回密码
立即注册

QQ登录

只需一步,快速开始

欢迎访问【程序人生-重庆纽新】,本网站为软件开发人员视觉的IT资讯、软件开发中各种问题的解决办法!!
搜索
发新帖


2308

积分

0

好友

259

主题
楼主
发表于 2015-4-14 10:49:54 | 查看: 3853| 回复: 0
其实这个标题命名的有点大,但是主题明确:就是使用StringTemplate模板引擎,采用HTML页面和ASP.NET页面(可以使用ASP.NET控件)作为模板,实现*****(这个实现什么就不用说了吧,这里省略200字。)


1. 模板技术的原理:

就是能够自动替换占位符的替换引擎。原理上也就是两个步骤,找到—>替换。但是替换不是简单的替换,包括:

简单变量替换();
复杂变量替换();
对象变量替换();
键值类型替换();
自定义集合替换();
同时显示多个变量();
模板调用();
给调用模板传参数();
值模板();
简单循环();
交差循环显示();
通过模板交差循环();
条件判断();
从文件中创建模板();


StringTemplate基本上就是按照这种模式来设计的。


2. 技术实现

2.1 首先是在HTML模板文件中:

姓名:$User.Name$ 年龄User.Value$

在对应的cs代码页面中:


  1. <font size="3">User us = new User();   
  2. us.Name = "xxsssx";   
  3. us.Value ="80";   
  4. StringTemplate st = new StringTemplate("$User.Name$,$User.Value$");   
  5. st.SetAttribute("User", us);   
  6. Console.WriteLine(st.ToString());  </font>
复制代码


2.2 与ASP.NET页面比较

aspx页面:

<aspabel id="Name" runat="Server" /><aspabel id="Mail" runat="Server" />

aspx.cs文件:


  1. <font size="3">User us = new User();   
  2. us.Name = "xxsssx";   
  3. us.Value ="80";   
  4. Name.Text=us.Name;   
  5. Mail.Text=us.Value  </font>
复制代码


在StringTemplate中,我们知道StringTemplate可以完成很多工作,实际的功能已经很强大了,包括比如条件判断、循环遍历...我们只需要在后端代码页面进行数据填充就可以了,但是对于复杂的业务逻辑呢?比如可以判断,可以循环,可以分支,可以使用现成的控件,对于复杂的功能,我们是不是很期望能够使用到ASP.NET本身自带的强大的控件呢?ok,恭喜你,你的想法将会得到实现!!哈哈!~


在开始之前,我们介绍一下使用ASP.NET模板与StringTemplate方法的对比:

                           aspx模板         StringTemplate
asp.net控件           支持                     不支持
复杂显示逻辑           支持                     支持(未经测试所有可能性)
编辑器支持              支持                     不支持
编译检测                 支持                     不支持



OMG!!用ASP.NET作为模板的话功能真是好强大啊!!但是。。。。关键的问题是。。怎么利用aspx的页面作为模板来被调用呢??

其实解决的方法很简单,只需要Server.Execute()就可以将执行的aspx页面运行的结果以一个TextWriter返回。

Server 是 ASP 中的一个内置对象,它有一个方法为 Execute,用法是:

Server.Execute(path)

微软认为它的闪光点是:可以将复杂的页面划分为多个模块,然后用 Server.Execute 将这些模块集中在一个页面显示。


例子:

页面First.aspx:


  1. <font size="3"><%  
  2. string str = "this is first page! ";  
  3. Response.Write(str + "started...");  
  4. Server.Execute("SecondPage.aspx");  
  5. Response.Write(str + "End...");  
  6. %>  </font>
复制代码

页面SecondPage.aspx:
  1. <font size="3"><%  
  2. string str = "this is the second page! "  
  3. Response.Write(str);  
  4. %>  </font>
复制代码


执行First.aspx:显示的结果为:

this is first page! starting...this is the second page! this is the first page! End...

看了这个结果是不是已经恍然大悟了??呵呵呵。。。
但是。。。别高兴得太早了。。。因为我们在st或者html的模板页面中,是要进行页面布局的,如果处理不好的话就会影响到页面的布局和样式,因为Server.Execute是无返回值的呀!!那怎么处理这个问题呢?oh!~~

其实解决办法很简单。。如下:
  1. <font size="3"> TextWriter tw = new StringWriter();  
  2. HttpContext.Current.Server.Execute("SpecialTopicsDetail.aspx", tw);  
  3.   
  4. string result = tw.ToString();   //做你想做的事情。。  </font>
复制代码


是简单吧?呵呵呵~

如果想利用用户控件完成的话也是可以的哟,具体方法请参考这里:

Render User Control as String Template :
http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx


另外,在Server.Execute中,调用和被调用的文件之间共享的内容有:
> Application 变量
> Session 变量
> Server 变量和属性
> Request 集合和属性,包括 Form、QueryString 数据。
> Response 集合和属性,被调用的文件可以更改 HTTP 头信息。但是同样要求还没有用 Response.Flush 向客户端发送有信息。
> Server.Execute 也可以形成递归,但递归达到一定的次数后不会像 Server.Transfer 一样自动终止,而是报错并终止。


ok,这里只讲了关键点的原理和实现,实际上基础的东西都没介绍,我想那些基础的东西对于大家来说早就精通了。。。
本文中引用了不少作者的成果,在这里也感谢他们的共享和付出,谢谢!




收藏回复 只看该作者 道具 举报

高级模式
B Color Image Link Quote Code Smilies



QQ|小黑屋| 码途山海.智隐长卷 渝ICP备15002301号-2   渝公网安备50011202504426

GMT+8, 2025-5-18 02:06 , Processed in 0.040701 second(s), 23 queries .

©Copyright 程序人生!

©2012-2015重庆纽新

快速回复 返回顶部 返回列表