您的位置:首页 > 编程语言 > ASP

再论asp.net模板引擎-超越模板引擎

2012-01-08 11:54 232 查看
说了半天看来还是没说明白,估计是长时间不写博语言组织能力退化了。其实要说的很简单,用了那么多模板引擎(为了赶项目自己还写过一个)结果到头来我发现自己在做一件很蠢的事情。让模板引擎支持判断,循环,分支,不同的强化出各种不同的标签,标签越来越像asp.net的控件标签,API越来越复杂。也许最后一回头发现我们实现了一个asp.net老早就已经存在的东西。那为什么我们不现在直接就拿来用了?
以下我将分几个部分来说明我的观点,再次重申,我不是说不用模板引擎,我的观点是aspx文件本身就是最好的模板引擎了,至于如何用,我后面会给出一个我自己用的一种方式,当然你也可以总结出你自己的:
一、模板引擎的软肋
很多做PHP的同学对模板引擎很熟悉,比如Smarty,说出这个主要是显得我还是懂点不是啥也没听说过的愣头青。模板引擎的优点当然不需要我多说,如果没优点那根本就没有存在的价值。首先第一个要面临的问题就是学习的成本。老实说,就现在的模板引擎的语法而言,而什么越来越向编程语言靠拢也就是为了降低学习的成本。下面是一段Smarty的模板代码:

{* Monte Ohrt March 4, 2002 *}
{* $cols is the number of columns you want *}
<TABLE border=1>
<TR>
{section name=numloop loop=$data}
<TD>{$data[numloop]}</TD>
{* see if we should go to the next row *}
{if not ($smarty.section.numloop.rownum mod $cols)}
{if not $smarty.section.numloop.last}
</TR><TR>
{/if}
{/if}
{if $smarty.section.numloop.last}
{* pad the cells not yet created *}
{math equation = "n - a % n" n=$cols a=$data|@count assign="cells"}
{if $cells ne $cols}
{section name=pad loop=$cells}
<TD> </TD>
{/section}
{/if}
</TR>
{/if}
{/section}
</TABLE>

复制代码

当然如果习惯了的同学会觉得也没啥啊,不过对于完全没接触的人来说,或者没空去学习的人(比如说我)来说,这段代码不仔细研究就跟天书一样。对于美工而言,更加是天书一般的存在,怪不得国内一个Smarty教程网站的站长说:赶紧来学吧,这玩意儿难学,工资高。对于IT来说越难学的工资越高,仿佛为了钱确实要跟自己过不去。换个其他的模板引擎也差不多,我就不一一列举代码了。除了模板本身的“模板语言”需要学习外,还有模板引擎本身的API需要学习。那么对于程序员和美工来说这都是双重负担。

其二就是编译支持和工具支持,Smarty还算不错,Dreamweaver里头有个插件,不过对于被智能感知菜单和编译期检测惯坏的.NETer 和Javaer来说还是显得太稚嫩了(没有智能感知菜单就请你杀了我吧)。看着文档写代码,然后run一下看看结果貌似是上个世纪的工作方式。或许有一天各类开源爱好者可以搞出各类插件来解决这个问题,不过谁有这个时间等待,谁有这个时间去一一试用那个插件好呢?

二、模板引擎使用的误区
现在大多数模板引擎所干的事情就是把数据和模板合拢一堆生成结果html(xml或者其他什么的暂时不考虑)。那么其中一个使用的误区就来了,把模板引擎误认为是换肤引擎,比如最典型的想法是:
#1楼 iiduce@163.com 2008-07-08 10:09 小狼壮壮
使用aspx做模板,怎么实现同一cs代码,多套模板共存,达到迅速更换模板的目的呢。
-------------------------------------------------------------------------------华丽的分割线--------------------------------------------------

模板引擎最常用的地方就是CMS系统了,CMS系统一般都会生成静态页面来提高效率。还有一个就是很多MVC框架会使用到模板引擎来实现View,不过如果如果页面很复杂,涉及大量的对象赋值以及循环和控制的话,可能会因为大量的反射而导致效率的瓶颈(关于这点没测试过,有兴趣的可以测测)。关于这两点基本都是直接生成最终结果。换肤等功能性的东西个人觉得不应该作为模板引擎的主要设计目的。

三、使用ASPX页面作为模板引擎的可行性和优势所在
可行性就不说了,当然是可行的,而且现在ASP.NET MVC已经在使用aspx页面做View层了,下面来说优势

学习效率

对编程人员来说根本就不用学了,本来就会的,学习效率当然最高。

工具支持和编译时检测

Dreamweaver和VS.NET都支持,而且智能感知菜单,编译时检测都存在。这点Very Nice

支持ASP.NET控件

这点有同学说控件不方便,那么其实不用控件,在页面上直接

%>
你的姓名是:<%=u.Name%>
<%}%>
复制代码

是不是还是一样的,何必非要把自己套死呢?

有人说是不是要在XX层引入System.Web,其实这个问题就有点搞笑了,MVC和分层完全是两码事了。就算是按分层的理论来说在逻辑层引入System.Web也不是什么问题,如果要用StringTemlate做模板引擎,那么肯定也要引入StringTemplate的Dll,那么用aspx页面做模板引擎的话引入System.Web不是也在情理之中么?

最后来说说我是怎么用的

调用模板还是通过Server.Execute,主要是为了解决调用文件的问题,我没有用load ascx文件的方式,而是定义了一个占位符,执行了这个页面后搜索一下有几个占位符,然后根据占位符去调用其他的模板,最后把执行后的结果替换过来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: