什么是模板引擎?说白了就是能够自动替换占位符的替换引擎。原理上也就是两个步骤,找到-》替换。但是替换不是简单的替换,包括:
简单变量替换();
复杂变量替换();
对象变量替换();
键值类型替换();
自定义集合替换();
同时显示多个变量();
模板调用();
给调用模板传参数();
值模板();
简单循环();
交差循环显示();
通过模板交差循环();
条件判断();
从文件中创建模板();
常用的模板引擎,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的页面怎么作为模板来被调用呢?以访问就直接看到了没办法生成静态页面啊?