asp.net服务器端指令include的使用及优势介绍

asp.net中的服务端包括指令简单点就是一个<!-- #include file|virtual="filename" –>这样的指令,msdn中的名词解释是:将指定文件的内容插入 ASP.NET 文件中,包括网页(.aspx 文件)、用户控件文件(.ascx 文件)和 Global.asax 文件。插入静态文件这个基本功能就不说了,插入aspx、ascx,这功能算是挺强了,asax哥就有点困惑了,这个暂且不管,今天要说的就是这个指令。

尴尬的存在
     服务器端包括指令在web的开发技术中肯定是个标配了。asp.net前身asp中就已经有了这个指令,做为唯一一个引用外部文件的指令,入门的开发人员都应该使用过;php中的include、require,几乎用滥了,曾经使用过一段php,这指令常用的不能再常用了;jsp没过开发经验,搜索了下,也有这个include指令,使用情况应该也很平常。但是asp.net中的include几乎是在被遗忘的角落里,读过的asp.net的书里,很少会提到它。因此,对于没有asp开发经验直接学习asp.net的来说,可能要本不知道它的存在。为什么??

造成尴尬存在原因之一,就是webform中最重要的功能之一:用户控件。为什么要使用include,是因为被引用的内容会在很多地方被使用到--重用,例如页头、页脚、网站功能块。而恰恰用户控件就是为此而生,它天生可重用的特性,及强大的控件事件流程,就如MSDN中所说:
     “尽管您仍然可以使用 #include 标记(通过将公共服务器端代码、控件或 HTML 标记放入要包括在其他网页中的文件内)以实现代码重用,ASP.NET 常用的首选方法是使用 Web 用户控件。用户控件提供了一个面向对象的编程模型,并且提供了比服务器端包含文件更多的功能。”
微软都不待见它了,紧接着,include也被开发人员打入冷宫,但是,请不要忘记,它存在。

include详解
       说是详解,其实不打算在这里详解,请参见:服务器端包括指令语法。语法、用法、示例什么的,这里也不说,大家自己去看或自己试验吧。

include优势
       说到优势,肯定要有个比较的对象了,对了,这个对象就是用户控件。用户控件是啥玩意,不解释。

优势之一:静态文件的重用。

用户控件功能强大,但是即使是简单如静态内容以用户控件的形式实现,它也必须经历用户控件的生命周期,相比性能就差了。

你可能会说,现如今网站又有多少还能是纯静态的内容呢,譬如页脚,那些项肯定也是网站CMS后台管理的,怎么可能以静态文件的形式存在,只能使用用户控件,并且给用户控件加上outputcache,这样即保证了灵活性,性能也能有保证,这样才是最完美的。

不错,第一,不同的项目不同的需求,肯定有些时候就是会引用静态内容,这时要保证使用这些静态内容以静态的形式存在,不要放到用户控件里。第二,网站的优化,无论何时,总有一种观点,就是静态化,例如上边的页脚,我们可以通过生成一个静态的页脚文件,当CMS对这些项有修改时,重新生成这个文件,然后通过include方式引用,相对于缓存的不可预测性和一定的不可控性,优势比用户控件还要灵活,并且性能更好。第三,协作,就是对于比较大型的网站,页面某些控件,但是这些数据是其它团队负责的,而一些相对稳定的内容或者对变化不太敏感的内容,生成静态文件之后自动分发,而对于这些文件的引用也是很常见的。

其实这个也可能是唯一的include的优势了。

优势之二,可穿透的封装。

可重用的东西一般都是封装的。用户控件是一个独立的个体,它寄宿于页面,但本身却像是页面上一个自由王国,碰到王国内部的处理,页面会把处理权交给控件自己的去处理,例如页面page_load加载时,碰到控件只能调用控件提供的load处理方法,这就是控件的封装,只有自身愿意公开的属性和方法才能被页面访问,这是标准的封装,这也是由asp.net的页面生命周期决定的。因此,如果控件要使用寄宿页面的一个变量,那么它应该公开一个属性,然后由页面在代码里主动给它赋值。

同样的,不同的机制决定了不同的行为。从MSDN中:

赋予 File 或 Virtual 特性的值必须用引号 ("") 括起来。在执行任何动态代码之前处理被包含的文件。

重要的一句,在执行任何动态代码之前处理被包含的文件。这句话什么意思??

一层意思就是说被包含文件在被处理之后内容才会加入到页面中,动态代码执行时,执行的代码根本就区分不出来这块内容是引用的还是自己本来就有的,也就是说我们可以用来重用的静态文件里加入<% 代码 %> 或者<%= 页面变量 %> 这样的代码,它们会被页面处理为相应的内容。这就是我所谓的“可穿透的封装”。这种方法当然比控件公开属性,页面主动赋值要更灵活。

二层意思如果引用的aspx或ascx,那么会在引用的动态内容执行输出之后,页面代码才会执行,这样就不如用户控件调用将流程在页面内好了,尽量不要使用include引用动态页面。

因此我们应只用include引用静态文件,但是静态文件里可以包含服务端标记代码。

知无不言,但怎奈能力有限,词不达意,就当抛砖引玉吧。大家尽量看,不过可以肯定的是可以以静态文件存在的重用就用include吧。可能还会有其它更适合的使用场景和更多的优势,还请有充分经验的补充。

(0)

相关推荐

  • ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

    最近打算尝试一下在ASP中实现MVC架构,肯定有人问我:ASP都淘汰了,为什么还研究?这点我也知道,自从微软放弃ASP 3.0转向ASP.NET后,ASP已经远远落后于和它几乎同时开始的PHP和JSP,开源比闭源的好处就像PHP和ASP一样,ASP说淘汰就淘汰,谁也救不了,但是值得注意的是ASP在中国市场还是蛮广泛的,尤其是一些中小企业的一些应用,简单的CMS不在话下,而且部署简单,在一些老旧的Windows系统上,不需要安装.NET Framework基本上就可以直接运行了,所以准备一个框架,

  • DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案

    我们注:理论上下面的方法可以可以的,但前提是保证你的php配置的没有错误,建议大家用新版的php版本,与discuz程序,相关的服务器相关软件可以到s.jb51.net下载. 这两天论坛经常报错误信息 Warning: require_once(./include/common.inc.php) [function.require- once]: failed to open stream: No such file or directory in E:\host\aydsw\index.php

  • 从php核心代码分析require和include的区别

    深入理解PHP之require/include顺序 http://www.jb51.net/article/25867.htm普及在php手册中: require() is identical to include() except upon failure it will also produce a fatal E_ERROR level error. In other words, it will halt the script whereas include() only emits a

  • php中echo()和print()、require()和include()等易混淆函数的区别

    1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细微差别的.echo输出后没有返回值,但print有返回值,当其执行失败时返回flase.因此可以作为一个普通函数来使用,例如执行下面的代码后变量$r的值将为1. $r = print "Hello World"; 这意味着print可用在一些复杂的表达式中,而echo则不行.但是,因为echo语句不要求返回任何数值,所已在代码中echo语句的运行效率要略微快于print语句. 2.i

  • set_include_path和get_include_path使用及注意事项

    set_include_path 设置默认包含路径 在include或require文件的时候,先在默认包含路径里面找,然后在同目录下找 例: D:/xampp/htdocs/test/include 下有一文件为cls.mysqli.php D:/xampp/htdocs/test/ 下有一文件为set_include_path.php 里面的内容为 复制代码 代码如下: set_include_path('/xampp/htdocs/test/include'); //请注意php里边的'/

  • 浅谈ASP.NET的include的使用方法

    我们学过的Code分离到不同文件的方法,主要包括: 程序集.dll.<inherits src>.cs.<script src>.cs.用户控件.ascx.include.Response.WriteFile() 程序集.dll:这是最高级的方法,它引用的是一个被编译为IL的DLL(程序集)文件. <inherits src>.cs:用这种方法,可以先定义一个继承Page类的新类,再在ASPX/ASCX文件中加工此类. <script src>.cs:可以把

  • c++ #include是怎么样工作的?

    可能不太熟悉,也有可能没有去关心过.我们只关心程序能否正确运行,或者程序怎么实现等等一些问题. 这里笔者就为介绍下我们熟悉又不太熟悉的"#include",首先我们了解下C/C++头文件. 头文件为相关声明提供了一个集中存在的位置.头文件一般包含类的定义,extern变量声明与函数声明.注意这里声明与定义的区别:它们最本质的区别是定义只可以出现一次,声明可以出现多次.声明不分配空间,而定义是要分配空间的.头文件正确使用可以保证所有文件使用给定实体的同一声明:当声明需要修改时,只有头文件

  • PHP include_path设置技巧分享

    1.include_path的意义 当时候函数include(),require(),fopen_with_path()函数来寻找文件时候.在不设置include_path的情况下,这些函数打开文件时候默认的是以web根目录去寻找.当设置include_path以后,这些php函数就会先在指定的include_path目录下面去搜索寻找. 其原理和window系统的环境变量相似,在window运行cmd命令的时候,输入一些cmd的命令之后系统会在其设定的环境变量里面去搜索这些命令是否存在,存在就

  • 深入理解PHP之require/include顺序 推荐

    也就有了如下的疑问: include_path是怎么起作用的? 如果有多个include_path顺序是怎么样的? 什么情况下include_path不起作用? 今天, 我就全面的介绍下这个问题, 先从一个例子开始吧. 如下的目录结构: root├ 1.php├ 3.php└ subdir├ 2.php└ 3.php 在1.php中: 复制代码 代码如下: <?php ini_set("include_path", ".:path_to_subdir"); r

  • smarty模板嵌套之include与fetch性能测试

    方法一.使用在父模板中使用{include file="child.tpl"}直接将子模板包含进来 优点: 1.有利于模块的划分和模板的重用. 2.嵌套层次不多的时候,模板的结构清晰,一眼过去就知道这个模板的内容和结构. 3.只需要一个smarty实例就能做完所有的事情,减少系统资源的占用. 不足: 1.子模板中的变量可能与父模板的变量发生冲突 2.多重嵌套的时候,变量名冲突的几率增大,为所有的变量赋值的难度也加大. 3.子模板的可操控性差,例如不能通过设置$cache_id, $co

  • 让Apache支持shtml实现include文件解析的配置方法

    1. 确认加载include.so模块,将注释去掉: LoadModule include_module libexec/apache2/mod_include.so 2. AddType部分去掉这两段注释: AddType text/html .shtml AddOutputFilter INCLUDES .shtml 3. Directory目录权限里面找到 Options Indexes FollowSymLinks 增加Includes修改为: Options Indexes Follo

  • php include加载文件两种方式效率比较

    先来说说两种方式: 1)定义一个字符串变量,里面保存要加载的文件列表.然后foreach加载. 复制代码 代码如下: $a = '/a.class.php;/Util/b.class.php;/Util/c.class.php'; $b = '/d.php;/e.class.php;/f.class.php;/g.class.php'; // 加载基本系统文件 $kernel_require_files = explode(';', $a);//SYS_REQUIRE_LIB_FILE_LIST

  • JS 实现完美include载入实现代码

    js为什么需要include?让我们想想这样1个场景,a.js 需要用到1个公用的common.js,当然你可以在用到a.js的页面使用<script src="common.js">,但假设有5个页面用到了a.js,你是不是要写5遍<script.而且要是以后a.js 又需要引用common2.js,你是不是又的修改5个页面了? 已有js include的一些问题 在写这个之前在网上搜索了些资料,发现以前写的include都存在2个问题,这也是include需要解决

  • JS实现完美include加载功能代码

    js为什么需要include?让我们想想这样1个场景,a.js 需要用到1个公用的common.js,当然你可以在用到a.js的页面使用<script src="common.js">,但假设有5个页面用到了a.js,你是不是要写5遍<script.而且要是以后a.js 又需要引用common2.js,你是不是又的修改5个页面了? 已有js include的一些问题 在写这个之前在网上搜索了些资料,发现以前写的include都存在2个问题,这也是include需要解决

  • jsp include引用非本级目录网页实现代码

    采用相对路径 假设当前目录名为a, 目标文件夹为b (1)如果b是a的上级目录, 复制代码 代码如下: <%@ include file="../xxx.jsp"%> (2)如果b是a的下级目录, 复制代码 代码如下: <%@ include file="b/xxx.jsp"%>

随机推荐