从模板引擎到模板引擎-使用aspx页面作为模板引擎的一种实现

此文完全有感而发,在网上看到很多介绍各类模板引擎的文章,但是我却越来越感觉到很多时候我们所做的事
情是在舍近求远。
什么是模板引擎?说白了就是能够自动替换占位符的替换引擎。原理上也就是两个步骤,找到-》替换。但是替换不是简单的替换,包括:
  • 简单变量替换();
  • 复杂变量替换();
  • 对象变量替换();
  • 键值类型替换();
  • 自定义集合替换();
  • 同时显示多个变量();
  • 模板调用();
  • 给调用模板传参数();
  • 值模板();
  • 简单循环();
  • 交差循环显示();
  • 通过模板交差循环();
  • 条件判断();
  • 从文件中创建模板();
常用的模板引擎,StringTemplate和velocity差不多都是按照这种模式来设计的。但是这样子真的就是我们需要的吗?我们拿一段典型的StringTemplate的模板代码来看看:

首先是在模板文件中:

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

然后是在代码里:

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());


那么我们来和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,你还是需要给它填充数据,而给它填充数据的代码仍然是属于视图而不是控制或者有人干脆就当作了模型。那么既然这样,为什么我们就不能用aspx页面本身来作为模板呢?它可以判断,可以循环,可以分支,可以使用现成的控件。比如

<%
if(Helper.IsLogin()){
User u=Helper.GetLoginedUser();
%>
你的姓名是:<%=u.Name%>
<%}%>

我们把这种方法和StringTemplate的方法来比较一下。

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

现在可能有个疑问了,aspx的页面怎么作为模板来被调用呢?以访问就直接看到了没办法生成静态页面啊?
其实解决的方法很简单,只需要Server.Execute()就可以将执行的aspx页面运行的结果以一个TextWriter返回。这样子要怎么处理还不是看我们怎么高兴啦。哈哈

记得之前有人提过类似方法,不过有人可能会质疑:那不是还有美工也会asp.net?其实回过头一想,如果你告诉美工<%=u.Name%>就是代表用户的姓名,那么也不会需要美工学习全套的asp.net,而其实就美工来说,如果学习简单实用asp.net都有困难,那么学习StringTemplate的全套模板语法和灵活掌握使用方法可能更加让人郁闷。如果这些工作都给程序员来完成的话,那么已经是程序员熟练掌握的c#语法是不是更加的平易近人呢?况且还可以智能感知菜单和编译检测支持。所以我觉得在大多数情况下这种方法是比较爽的一种方式。

PS,现在公司有个java的项目,我也直接让下面的同学直接用jsp页面当作模板,反响不错,大家都觉得很happy:』

posted on 2008-07-08 09:54 亚历山大同志 阅读(2341) 评论(22)  编辑 收藏 所属分类: 随笔

评论

#1楼  2008-07-08 10:09 小狼壮壮      

使用aspx做模板,怎么实现同一cs代码,多套模板共存,达到迅速更换模板的目的呢。   回复  引用  查看    

#2楼  2008-07-08 10:18 丁学      

TO 楼上:
模板里用标签,aspx里用控件,其实一样的   回复  引用  查看    

#3楼  2008-07-08 10:22 云の世界      

User us = new User();
us.Name = "xxsssx";
us.Value ="80";
Name.Text=us.Name;
Mail.Text=us.Value
你这样写的结果,如果aspx里没优定义
<asp:Label id="Name" runat="Server" /><asp:Label id="Mail" runat="Server" />
那么一定会报错。
string template的话,则不会报错。
Asp.net MVC 是用aspx做模板的最好例子。
  回复  引用  查看    

#4楼 [楼主] 2008-07-08 10:27 亚历山大同志      

@云の世界
报错和不报错我觉得还是报错的好,起码你会知道现在界面显示逻辑有问题。

@小狼壮壮
你看到最后的话会发现其实我直接在ASPX页面上嵌入C#代码,而放弃了aspx.cs的代码文件,所以不存在你所说的这个问题   回复  引用  查看    

#5楼  2008-07-08 10:34 菜菜灰      

看似不错,不过介绍的都是比较简单,复杂的应用如嵌套循环,导入文件没有看到类似的说明。期待下文~   回复  引用  查看    

#6楼  2008-07-08 10:42 云の世界      

也是,报错有报错的道理。 呵呵。
虽然aspx.cs和aspx都是view层,
但是我觉得,基本的赋值之类的,尽量还是都写到aspx里的好,
毕竟view层往往是多变的,
今天你往个textbox里赋值,
明天客户可能要用个label显示,所以赋值逻辑和显示逻辑紧密耦合。
内联循环之类能少则少,或者用repeater代替。   回复  引用  查看    

#7楼  2008-07-08 10:55 云の世界      

可以这样理解aspx,不仅仅是模板。呵呵。   回复  引用  查看    

#8楼  2008-07-08 11:10 tubo      

是一种解决方法,但是如果是要在业务逻辑层使用模板,如何获取Server.Execute()?   回复  引用  查看    

#9楼  2008-07-08 11:17 飞天老鼠      

@tubo
HttpContext.Current.Server.Execute(..)   回复  引用  查看    

#10楼  2008-07-08 11:18 chegan      

@ 小狼壮壮
可以在cs文件中使用LoadControl的方法来载入指定的模板文件,只不过这个模板文件要用ascx文件了。在asp.net forums里面大量使用了这个方法   回复  引用  查看    

#11楼  2008-07-08 11:26 坏人      

我们在干着一模一样的事,哈哈   回复  引用  查看    

#12楼  2008-07-08 11:43 tubo      

@飞天老鼠
那么需要在业务逻辑层引入System.Web了?   回复  引用  查看    

#13楼  2008-07-08 11:59 黎杰荣      

感觉楼主没有用过php,还不清楚模板的优势和特点。
在我看来,用模板的最大优势是让数据和界面完全分开,如果再结合一下xslt语言,就能更加发挥优势了。
模板技术并不是仅仅让程序员和美工分工的,对单纯程序员的工作也很有帮助,在一些比较大的项目里,如果用楼主举例的控件绑定数据的方法,那绝对是非常痛苦的事情,一旦该界面,你就会知道什么叫抓狂。实事上,我觉得asp.net控件不是很适合大型项目的开发(纯属个人观点啊)。   回复  引用  查看    

#14楼 [楼主] 2008-07-08 12:13 亚历山大同志      

@黎杰荣
其实我感觉你是没有仔细看本文或者是没看懂我再说什么,呵呵   回复  引用  查看    

#15楼 [楼主] 2008-07-08 12:16 亚历山大同志      

@黎杰荣
ps:做PHP的不理解为什么java和.NET的同学对模板引擎为什么这么想往,就跟男人不知道女人胸前多两陀肉是啥感觉一样。呵呵
  回复  引用  查看    

#16楼  2008-07-08 12:23 52Qin      

LoadControl方法不错,我觉得这种方法可以达到界面和程序分离
可以配置URLReWrite 定义URL访问规则.实现自己的MVC
  回复  引用  查看    

#17楼  2008-07-08 13:06 小生      

@亚历山大同志
好久不見

支持﹐我一直用aspx的<%%>語法﹐覺得這其實就是.net下最好的模板輸出:)
  回复  引用  查看    

#18楼  2008-07-08 13:37 XNet      

一直想找一个比较方便的模板引擎,其实也知道模板引擎的好处,不过还是习惯并且喜欢在ASPX中直接使用<%%>语法!   回复  引用  查看    

#19楼  2008-07-08 15:47 EricWen      

通过配置XML,使用TpiSyntaxAnalyzer语法分析,快速生成网页
C# 2.0 支持多数据源的。   回复  引用  查看    

#20楼  2008-07-08 22:52 晓攀      

"只需要Server.Execute()就可以将执行的aspx页面运行的结果以一个TextWriter返回",谢谢楼主,我一直没用aspx做引擎,是因为我不知道怎么输出成静态页面。
问个问题:asp.net forums的ascx做模板引擎页面和你上面所说的aspx,你觉得哪个在现实开发中更方便一些?我个人觉得用ascx的这种开发起来比较麻烦,速度会减慢。   回复  引用  查看    

#21楼  2008-07-09 07:24 weidagang2046      

如果想在Console程序里面使用ASPX页面做模板应该怎么做?希望楼主写个简单教程。   回复  引用  查看    

#22楼  2008-07-10 00:47 问天      

使用ASPX页面做模板的问题在于麻烦,并且不灵活。

回过头看你文中提到的例子:
aspx.cs文件
User us = new User();
us.Name = "xxsssx";
us.Value ="80";
Name.Text=us.Name;
Mail.Text=us.Value

模板就是模板,为什么还一定要绑定这么一个cs文件呢?并且,aspx默认是规定一个aspx文件对应一个cs的code-beside……

cs文件的维护很讨厌……一旦绑定的数据更改,这个cs也需要随着改……

无法做到动态生成模板,并绑定数据到模板中……

但重写一套模板系统需要的体力活粉大……而各种模板系统又各有优劣,互不通用……

我现在是使用ascx做模板去用……直接LoadControl就是了,不需要server.execute……感觉server.execute并不稳定,很容易崩溃……   回复  引用  查看    

导航

公告

鉴于很多TX投诉黑色背景杀伤眼球,遂换个容易阅读的
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

统计

与我联系

搜索

 

常用链接

留言簿(28)

我参加的小组

我的标签

随笔分类(82)

随笔档案(82)

相册

朋友的Blog

同事的Blog

最新随笔

积分与排名

最新评论

  • 1. re: 鬼吹灯-漫谈大型网站的架构
  • 图是好画,开发起来并不容易;
  • --三千
  • 2. re: Why .NET Sucks?
  • @亚历山大同志 我认为只要能快速开发出客户需要的服务或应用,快速的为客户实现价值,.net也没什么问题啊。 至于钱钱没有做java的拿的多,一般情况而言两种原因:一、java本身开发难度大、实现繁琐,...
  • --网际浪人
  • 3. re: Why .NET Sucks?
  • --引用-------------------------------------------------- 问天: @Kai.Ma 我找不到开源并且成熟的pop3/imap client,我要求不高...
  • --Ivony...
  • 4. re: Why .NET Sucks?
  • @Kai.Ma我找不到开源并且成熟的pop3/imap client,我要求不高,gb2312/utf 8中文不乱码,能解outlook发的附件就成。这么些年了,.net东西慢慢是有了,但数量、质量无...
  • --问天
  • 5. re: Why .NET Sucks?
  • @问天
    .Net下开源且成熟的东西找找还是蛮多的。:)
  • --Kai.Ma

阅读排行榜

评论排行榜

60天内阅读排行