模板引擎的一种实现-aspx页面的实现

时间:2021-11-12 17:49:45

       什么是模板引擎?说白了就是能够自动替换占位符的替换引擎。原理上也就是两个步骤,找到-》替换。但是替换不是简单的替换,包括:

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


        常用的模板引擎,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());

 

[NextPage]

        那么我们来和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#语法是不是更加的平易近人呢?况且还可以智能感知菜单和编译检测支持。所以我觉得在大多数情况下这种方法是比较爽的一种方式。