• Discuz!NT代码阅读笔记(7)模板初探:生成的模板是怎样执行的


    相关链接:

    Discuz!NT代码阅读笔记(1)--从HttpModule开始:首页的显示

    Discuz!NT代码阅读笔记(2)--网站安装也能自动化:论坛程序安装及初始化过程

    Discuz!NT代码阅读笔记(3)--网站安装也能自动化(2)--DNT安装时使用到的几个函数解析

    Discuz!NT代码阅读笔记(4)-- 一切皆可配置:页面的显示

    Discuz!NT代码阅读笔记(5)-- 从全局看看:各个模块功能摘要

    Discuz!NT代码阅读笔记(6)-- 从全局看看:各个模块功能摘要(2)

     

    DNT界面显示原理,来自官方

     

    1ASP.NET内联编码编译时间问题

             先说下我的一个试验:

    新建一个WebApplication工程,打开Default.aspx文件,删除除<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true"  Inherits="Test2010._Default" %>

    之外的内容。之后在它的下边添加如下代码:

    <%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true"  Inherits="Test2010._Default" %>

    <%@ Import Namespace="System.Data" %>

    <%@ Import Namespace="System.Text" %>

    <script runat="server">

        protected override void OnInit(EventArgs e)

        {

            base.OnInit(e);

            StringBuilder bld = new StringBuilder();

            bld.Append("abc");

            bld.Append("<script type=\"text/javascript\"");

            bld.Append("\">alert('abc')</");

            bld.Append("script>\r\n");

            Response.Write(bld.ToString());

            Response.Write(sss());  

        }

     

        public string sss()

        {

            return " abcdefg";

        }

    </script>

    编译,发布。打开发布后的网站,在Bin文件夹中可以看到生成的DLL。用Reflector打开这个DLL后,可以发现没有我在页面中添加的sss()这个函数。

    查看发布后的页面文件,可以看到页面文件中的内容与发布前没有任何不同,说明页面内联的代码在深层和发布时都没有被编译。

           但是,与其相对应的Cs文件却没有了。它已经被编译到DLL中去了。这一点,通过Reflector可以很清楚地看到。

    F5运行这个项目,在浏览器查看Default.aspx的原文件,可以看见只有这么一行东西:

    abc<script type="text/javascript"">alert('abc')</script>

    abcdefg

    这是已经被编译后输出到浏览器的代码。内联页面内的代码此时已经被解析过了。

    于是,有一个结论:页面内联的代码是在执行时进行解析的(或者叫编译,我不知道究竟该怎么叫它)。

    2、看看DNT的页面文件

             DNTUI是基于模板机制的。模板都存放在Discuz.Web工程中的Aspx文件夹中。每个模板主题一个文件夹。

             查看这些模板中的页面文件,可以看见每个页面中都有如下的组织结构:

    <%@ Page language="c#" AutoEventWireup="false" EnableViewState="false" Inherits="指示了隐藏的代码类" %>

    <%@ Import namespace="System.Data" %>

    <%@ Import namespace="Discuz.Common" %>

    <%@ Import namespace="Discuz.Forum" %>

    <%@ Import namespace="Discuz.Entity" %>

     

    <script runat="server">

    override protected void OnInit(EventArgs e)

    {

     

        /*

            This page was created by Discuz!NT Template Engine at 2009-9-22 17:25:25.

            本页面代码由Discuz!NT模板引擎生成于 2009-9-22 17:25:25.

        */

     

        base.OnInit(e);

     

        templateBuilder.Capacity = 220000;

    //……省略中间内容……..

        Response.Write(templateBuilder.ToString());

    }

    </script>

    这里,首先使用StringBulider templateBuilder组织需要页面内容,然后通过Response.Write(templateBuilder.ToString());将组织好的内容输出到Http响应的输出流中。经过IIS解析后(也可能是CGI之类的东西,我没查到),发给客户端,显示在浏览器中。

    这样的代码发布后依然包含在页面文件中。后边添加的模板,也是这样的结构,他们共用一个已经编译好的存放在DLL中的页面类。这些Aspx文件中的东西只有等到需要时才被编译。据说这种做法可以在程序编译好后为程序添加模板。

    DNT有自己的后台项目Discuz.Web.Admin包含了自动生成模板的功能。它可以根据用户定义好的css文件,生成论坛可以用的模板,输出的同样是具有这种结构的Aspx文件。这样,不同的DNT模板就可以共用一个cs文件,即编译在DLL文件中的页面类。最终用户只需要定义模板显示的方式(CSS),而不需要去花时间理解页面内的各种函数。即使不理解Asp.Net,也能定义出漂亮的模板了。

     

    Technorati 标签: DNT
  • 相关阅读:
    Kinect研究文档
    Unity使用Win10语音
    使用unity2017.3 vuforia7摄像头放大的问题
    Unity响应Android的返回键,退出当前Activity
    unity调用Android百度地图
    Unity带参数的协程
    Android jenkins动态参数配置
    如何下载浏览器视频
    mac 如果修改环境变量
    mac如何修改hosts文件
  • 原文地址:https://www.cnblogs.com/zyqgold/p/1739964.html
Copyright © 2020-2023  润新知