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也被开发人员打入冷宫,但是,请不要忘记,它存在。
说是详解,其实不打算在这里详解,请参见:服务器端包括指令语法。语法、用法、示例什么的,这里也不说,大家自己去看或自己试验吧。
说到优势,肯定要有个比较的对象了,对了,这个对象就是用户控件。用户控件是啥玩意,不解释。
优势之一:静态文件的重用。
用户控件功能强大,但是即使是简单如静态内容以用户控件的形式实现,它也必须经历用户控件的生命周期,相比性能就差了。
你可能会说,现如今网站又有多少还能是纯静态的内容呢,譬如页脚,那些项肯定也是网站CMS后台管理的,怎么可能以静态文件的形式存在,只能使用用户控件,并且给用户控件加上outputcache,这样即保证了灵活性,性能也能有保证,这样才是最完美的。
不错,第一,不同的项目不同的需求,肯定有些时候就是会引用静态内容,这时要保证使用这些静态内容以静态的形式存在,不要放到用户控件里。第二,网站的优化,无论何时,总有一种观点,就是静态化,例如上边的页脚,我们可以通过生成一个静态的页脚文件,当CMS对这些项有修改时,重新生成这个文件,然后通过include方式引用,相对于缓存的不可预测性和一定的不可控性,优势比用户控件还要灵活,并且性能更好。第三,协作,就是对于比较大型的网站,页面某些控件,但是这些数据是其它团队负责的,而一些相对稳定的内容或者对变化不太敏感的内容,生成静态文件之后自动分发,而对于这些文件的引用也是很常见的。
其实这个也可能是唯一的include的优势了。
优势之二,可穿透的封装。
可重用的东西一般都是封装的。用户控件是一个独立的个体,它寄宿于页面,但本身却像是页面上一个自由王国,碰到王国内部的处理,页面会把处理权交给控件自己的去处理,例如页面page_load加载时,碰到控件只能调用控件提供的load处理方法,这就是控件的封装,只有自身愿意公开的属性和方法才能被页面访问,这是标准的封装,这也是由asp.net的页面生命周期决定的。因此,如果控件要使用寄宿页面的一个变量,那么它应该公开一个属性,然后由页面在代码里主动给它赋值。
同样的,不同的机制决定了不同的行为。从MSDN中:
赋予 File 或 Virtual 特性的值必须用引号 ("") 括起来。在执行任何动态代码之前处理被包含的文件。
重要的一句,在执行任何动态代码之前处理被包含的文件。这句话什么意思??
一层意思就是说被包含文件在被处理之后内容才会加入到页面中,动态代码执行时,执行的代码根本就区分不出来这块内容是引用的还是自己本来就有的,也就是说我们可以用来重用的静态文件里加入<% 代码 %> 或者<%= 页面变量 %> 这样的代码,它们会被页面处理为相应的内容。这就是我所谓的“可穿透的封装”。这种方法当然比控件公开属性,页面主动赋值要更灵活。
二层意思如果引用的aspx或ascx,那么会在引用的动态内容执行输出之后,页面代码才会执行,这样就不如用户控件调用将流程在页面内好了,尽量不要使用include引用动态页面。
因此我们应只用include引用静态文件,但是静态文件里可以包含服务端标记代码。
知无不言,但怎奈能力有限,词不达意,就当抛砖引玉吧。大家尽量看,不过可以肯定的是可以以静态文件存在的重用就用include吧。可能还会有其它更适合的使用场景和更多的优势,还请有充分经验的补充。