其实这个标题命名的有点大,但是主题明确:就是使用StringTemplate模板引擎,采用HTML页面和ASP.NET页面(可以使用ASP.NET控件)作为模板,实现*****(这个实现什么就不用说了吧,这里省略200字。)
1. 模板技术的原理:
就是能够自动替换占位符的替换引擎。原理上也就是两个步骤,找到—>替换。但是替换不是简单的替换,包括:
简单变量替换();
复杂变量替换();
对象变量替换();
键值类型替换();
自定义集合替换();
同时显示多个变量();
模板调用();
给调用模板传参数();
值模板();
简单循环();
交差循环显示();
通过模板交差循环();
条件判断();
从文件中创建模板();
StringTemplate基本上就是按照这种模式来设计的。
2. 技术实现
2.1 首先是在HTML模板文件中:
姓名:$User.Name$ 年龄:$User.Value$
在对应的cs代码页面中:
User us = new User(); us.Name = "xxsssx"; us.Value ="80"; StringTemplate st = new StringTemplate("$User.Name$,$User.Value$"); st.SetAttribute("User", us); Console.WriteLine(st.ToString());
2.2 与ASP.NET页面比较
aspx页面:
<asp:Label id="Name" runat="Server" /><asp:Label id="Mail" runat="Server" />
aspx.cs文件:
User us = new User(); us.Name = "xxsssx"; us.Value ="80"; Name.Text=us.Name; Mail.Text=us.Value
在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:
<% string str = "this is first page! "; Response.Write(str + "started..."); Server.Execute("SecondPage.aspx"); Response.Write(str + "End..."); %>
页面SecondPage.aspx:
<% string str = "this is the second page! " Response.Write(str); %>
执行First.aspx:显示的结果为:
this is first page! starting...this is the second page! this is the first page! End...
看了这个结果是不是已经恍然大悟了??呵呵呵。。。
但是。。。别高兴得太早了。。。因为我们在st或者html的模板页面中,是要进行页面布局的,如果处理不好的话就会影响到页面的布局和样式,因为Server.Execute是无返回值的呀!!那怎么处理这个问题呢?oh!~~
其实解决办法很简单。。如下:
TextWriter tw = new StringWriter(); HttpContext.Current.Server.Execute("SpecialTopicsDetail.aspx", tw); string result = tw.ToString(); //做你想做的事情。。
是简单吧?呵呵呵~
如果想利用用户控件完成的话也是可以的哟,具体方法请参考这里:
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,这里只讲了关键点的原理和实现,实际上基础的东西都没介绍,我想那些基础的东西对于大家来说早就精通了。。。
本文中引用了不少作者的成果,在这里也感谢他们的共享和付出,谢谢!
本文参考网址:
http://blog.csdn.net/ming_chang/archive/2009/06/01/4234426.aspx
http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx
http://www.cftea.com/c/2006/09/KMA6IL9SD8Y9P6GZ.asp