随笔 - 19  文章 - 0  评论 - 21 
  2011年1月25日

送给各位同行们一首小诗,工作之余放松一下,调节一下气氛~

锄禾日当午,不如coding苦,对着C++,一调一下午;

锄禾日当午,不如coding苦,调了一下午,BUG还得补;

 锄禾日当午,不如coding苦,Bug刚补完,结构需重组;

锄禾日当午,哪有coding苦,Bug改不完,无言见列祖!

俗话说:“一艘没有航行目标的船,任何方向的风都是逆风”,作为吃青春饭的程序员们更是如此,更要做好自己的职业生涯的规划。大学4年的磨练,到二十二三岁毕业,经过1~2年的磨练,25岁左右才真正踏入了程序员的生涯,而35岁则成为中国程序员们一个不可逾越的鸿沟,我们只有10年的大好时光!怎能浑浑噩噩混日子,当一天和尚撞一天钟,否则当你真到了35岁的时候,将不堪回首!那时,摆在你面前的有两条路:要么放弃热爱的一线开发行业转向管理或者系统架构师,这是比较理想的一条路线,可是程序员这么多,管理的岗位毕竟是少数,千军万马过独木桥的局面绝对不是危言耸听!你就那么确信你一定比别人强?其实走到管理的岗位,更多的是协调,大局观,你曾经引以为豪的技术,反而不是那么重要了,你的竞争力在哪里??另一条路就是转行,抑或创业,而同时这就意味着:你以前的风光,别人眼中的大牛,不得不成为另一个行业中的新人,从零开始,踏上新的征程……而你前10年的甚至15年的积累,都将成为沉没成本,将会是一个惨烈而无奈的结局!所以既然我们选择了这条路,就一定在有限的时间内,做好职业生涯的规划,不可一天天的混日子!

跳槽,是程序员们这个时期敏感而不可回避的话题!当你从学校刚出来,满腔热血想大干一场,招聘会上却到处都是要求**年工作经验,在中国有企业愿意培养你吗??你终于化茧成蝶,成为独当一面的大牛,当你兢兢业业,为一个功能绞尽脑汁,冥思苦想,累坏了身体,胃痛颈椎痛,多少个不眠夜,伴随着青灯,手指在键盘上飞舞的时候,你可曾抬头,想一想明天的路该怎样走?“俯首甘为孺子牛”是一种值得尊敬的精神,可是你的老板看到你的价值所在了吗?主动给你加过薪吗?一些心存幻想的同学应该好好读读《资本论》,作为一个IT从业人员,你等不起!等到革命成功的时候,你早已经成为先烈,被刻在了墓碑上面!

如果不能体现出你应有的价值,跳槽,是必然的选择,也是唯一的出路!不跳槽或者跳不动槽混日子的马不是好马,即使是千里马也是一匹傻马!跳不动的时候,只能成为案板上的鱼肉,任人宰割吧!舍得舍得,没有“舍”哪有“得”?在中国这个浮躁的大背景下,更浮躁的IT行业,你沉不下来!人必须自私一点,实现共产主义的伟大理想,让给别人吧!孔老夫子都教育我们:“学而不思则罔,思而不学则殆”,对人生更是如此,没有一个明确的职业生涯的规划,只知道沉迷于技术,你将会输的很惨,很惨!毕竟我们大部分都是凡人,coding只是我们谋生的一种工具罢了,在中国这个浮躁的社会,愤青没用,你要懂得适者生存的道理,才能走的更远……

最后,祝愿同行们在新的一年里,做好自己的职业生涯规划,爱情事业双丰收!今天为成为一个技术人而沾沾自喜的人,如果不把眼光放长远一些,明天你将会为此而哭泣!

posted @ 2011-01-25 10:08 海风吹呀吹 阅读(307) 评论(4) 编辑
  2010年12月8日

一个人的孤独,一个人的封闭,不如一起努力! 总是有使用VSTS WebTest的同学问,我的Web测试记录器无效了,弹出IE后,记录的按钮老是灰色的。前面我写过一篇文章VSTS 启动web测试记录器无效 里面提供了一些解决的方法,但反馈是无效。后面我自己试用了一个方法,比较土,就是如果你安装的是IE6.0,碰到此问题可以安装IE7.0解决,解决后如果你觉得IE7.0不好用,可以把IE7.0卸载掉,问题也不会出现,这个方法我在2台电脑上实验过,都成功了。
刚好,今天又看到了一篇文章(怎么不早点看到呢),在Michael Taute's Blog上专门写了一篇Diagnosing and fixing Web Test recorder bar issues ,里面详细分析了在不同IDE,不同操作系统碰到此问题如何解决的方法,有现成的了,那也不翻译了,转贴在下面,再碰到此问题的同学可以参照修复。

Diagnosing and fixing Web Test recorder bar issues.

Since VSTS 2005 shipped there have been a variety of different questions raised by customers over the years. One topic which comes up somewhat frequently is a disabled or nonexistent web test recorder bar when recording web tests. Since it can be frustrating to diagnose and fix these problems, I’ve compiled a list of the most common reasons for this to happen and potential fixes for each.

If you know of something that fits the “My web test recorder bar isn’t working” criteria and isn’t on the list, please let me know and I’ll try to add it.

VSTS 2005 : Any OS : Recorder bar is not displaying when recording a webtest.

Fix: Upgrade to VSTS 2005 SP1.   There are a few bugs preventing the webtest recorder bar from displaying under certain circumstances that were fixed in SP1.  If you're having trouble in VS 2005 and haven't yet upgraded to SP1, that's your first step.

VSTS 2005 : Vista : Recorder bar displays, but the controls are disabled.

Fix: Webtest recording using VS 2005 on Vista only works when running in elevated mode.  [When launching VS 2005, right click the icon and choose to run as administrator]

VSTS 2005, 2008 : Windows 2003 / Vista : Recorder bar comes up, but the controls are disabled.

Fix : the web test recorder bar does not work with IE enhanced security enabled. (VSTS 2008 will actually display an error message telling you this) IE enhanced security can be removed from within the Control panel / Add Remove Programs / Windows Setup

VSTS 2008 : Vista (64 bit) : Recorder bar does not appear when recording a new webtest

Fix: This is actually a Vista bug. The fix is to delete your Vista user profile settings and then log back in. After your user profile is recreated, webtest recording works again. Here are the detailed resolution steps:

1)      Go to control panel

2)      Open system

3)      Click advanced

4)      Click User Profiles

5)      Find yours and delete it

6)   Log back into the machine with your account and create a web test.

VSTS 2005, 2008 : Any OS : Recorder bar does not appear when recording a new webtest

Fix: Make sure that you don’t have browser add-ons disabled. Specifically, the web test recorder helper add-on needs to be enabled. For Internet Explorer 7, you can find this setting in Tools / Internet options / Program [tab] / Manage add-ons. From there, verify that Microsoft Web Test Recorder Helper is enabled.

VSTS 2008 : Any OS (IE 7) : When recording, a new web browser opens up and the new browser doesn’t have a recorder bar.

Fix:  The reason for this is that by default, about:Blank is displayed in the browser when you start recording. This website is (by default) in the internet security zone (protected mode: on). When you open a website in a different zone (without protected mode) it will be handled by a new instance of internet explorer.  

The fix is to do one of 2 things: a) Move about:blank into the zone where you’re attempting to record from or b) Change the default web page which is brought up when you start recording to something in the same zone as you’re trying to record. You can accomplish this by setting the following registry key

[HKEY_CURRENT_USER"Software"Microsoft"VisualStudio"9.0"EnterpriseTools"QualityTools"WebLoadTest]

"StartingLocation"="http://server/website"

Published Friday, November 09, 2007 5:20 PM by Mike Taute

Filed under:
====================

工具 - internet选项 - 程序 - 管理加载项,enalbe了web test recorder help之后,,成功了!!!!!!!!

posted @ 2010-12-08 09:56 海风吹呀吹 阅读(91) 评论(0) 编辑
  2010年9月13日

//遍历option和添加、移除option
function changeShipMethod(shipping){
 var len = $("select[@name=ISHIPTYPE] option").length
 if(shipping.value != "CA"){
  $("select[@name=ISHIPTYPE] option").each(function(){
   if($(this).val() == 111){
    $(this).remove();
   }
  });
 }else{
  $("<option value='111'>UPS Ground</option>").appendTo($("select[@name=ISHIPTYPE]"));
 }
}


//取得下拉选单的选取值

$('#testSelect option:selected').text();
或$("#testSelect").find('option:selected').text();
或$("#testSelect").val();
//////////////////////////////////////////////////////////////////
记性不好的可以收藏下:
1,下拉框:

var cc1   = $(".formc select[@name='country'] option[@selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)
var cc2 = $('.formc select[@name="country"]').val();   //得到下拉菜单的选中项的值
var cc3 = $('.formc select[@name="country"]').attr("id"); //得到下拉菜单的选中项的ID属性值
$("#select").empty();//清空下拉框//$("#select").html('');
$("<option value='1'>1111</option>").appendTo("#select")//添加下拉框的option

稍微解释一下:
1.select[@name='country'] option[@selected] 表示具有name 属性,
并且该属性值为'country' 的select元素 里面的具有selected 属性的option 元素;
可以看出有@开头的就表示后面跟的是属性。

2,单选框:
$("input[@type=radio][@checked]").val();   //得到单选框的选中项的值(注意中间没有空格)
$("input[@type=radio][@value=2]").attr("checked",'checked'); //设置单选框value=2的为选中状态.(注意中间没有空格)

3,复选框:
$("input[@type=checkbox][@checked]").val(); //得到复选框的选中的第一项的值
$("input[@type=checkbox][@checked]").each(function(){ //由于复选框一般选中的是多个,所以可以循环输出
   alert($(this).val());
   });

$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾


当然jquery的选择器是强大的. 还有很多方法.

<script src="jquery-1.2.1.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$(document).ready(function(){
$("#selectTest").change(function()
{
       //alert("Hello");
       //alert($("#selectTest").attr("name"));
       //$("a").attr("href","xx.html");
       //window.location.href="xx.html";
       //alert($("#selectTest").val());
       alert($("#selectTest option[@selected]").text());
       $("#selectTest").attr("value", "2");

});
});
</script>


<a href="#">aaass</a>

<!--下拉框-->
<select id="selectTest" name="selectTest">
<option value="1">11</option>
<option value="2">22</option>
<option value="3">33</option>
<option value="4">44</option>
<option value="5">55</option>
<option value="6">66</option>
</select>
jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
                $("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
                $("#chk2").attr("checked",true);//打勾
                if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
            $("<optionvalue='1'>1111</option><optionvalue='2'> 2222</option>").appendTo("#sel")//添加下拉框的option
            $("#sel").empty();//清空下拉框

获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

posted @ 2010-09-13 12:26 海风吹呀吹 阅读(135) 评论(0) 编辑
  2010年8月7日

 

摘要:了解为 ASP.NET Web 页面建立的事件模型,以及 Web 页面转变为 HTML 过程中的各个阶段。ASP.NET HTTP 运行时负责管理对象管道,这些对象首先将请求的 URL 转换成 Page 类的具体实例,然后再将这些实例转换成纯 HTML 文本。本文将探讨那些作为页面生命周期标志的事件,以及控件和页面编写者如何干预并改变标准行为。(本文包含一些指向英文站点的链接。)

目录
简介
真正的 Page 类
页面的生命周期
执行的各个阶段
小结

简介
对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道。HTTP 管道由一系列托管对象组成,这些托管对象按顺序处理请求,并将 URL 转换为纯 HTML 文本。HTTP 管道的入口是 HttpRuntime 类。ASP.NET 结构为辅助进程中的每个 AppDomain 创建一个此类的实例。(请注意,辅助进程为每个当前正在运行的 ASP.NET 应用程序维护一个特定的 AppDomain。)

HttpRuntime 类从内部池中获取 HttpApplication 对象,并安排此对象来处理请求。HTTP 应用程序管理器完成的主要任务就是找到将真正处理请求的类。当请求 .aspx 资源时,处理程序就是页面处理程序,即从 Page 继承的类的实例。资源类型和处理程序类型之间的关联关系存储在应用程序的配置文件中。更确切地说,默认的映射集是在 machine.config 文件的 <httpHandlers> 部分定义的。但是,应用程序可以在本地的 web.config 文件中自定义自己的 HTTP 处理程序列表。以下这一行代码就是用来为 .aspx 资源定义 HTTP 处理程序的。

<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
扩展名可以与处理程序类相关联,并且更多是与处理程序工厂类相关联。在所有情况下,负责处理请求的 HttpApplication 对象都会获得一个实现 IHttpHandler 接口的对象。如果根据 HTTP 处理程序来解析关联的资源/类,则返回的类将直接实现接口。如果资源被绑定到处理程序工厂,则还需要额外的步骤。处理程序工厂类实现 IHttpHandlerFactory 接口,此接口的 GetHandler 方法将返回一个基于 IHttpHandler 的对象。

HTTP 运行时是如何结束这个循环并处理页面请求的?ProcessRequest 方法在 IHttpHandler 接口中非常重要。通过对代表被请求页面的对象调用此方法,ASP.NET 结构会启动将生成浏览器输出的进程。

真正的 Page 类
特定页面的 HTTP 处理程序类型取决于 URL。首次调用 URL 时,将构建一个新的类,这个类被动态编译为一个程序集。检查 .aspx 资源的分析进程的结果是类的源代码。该类被定义为命名空间 ASP 的组成部分,并且被赋予了一个模拟原始 URL 的名称。例如,如果 URL 的终点是 page.aspx,则类的名称就是 ASP.Page_aspx。不过,类的名称可以通过编程方式来控制,方法是在 @Page 指令中设置 ClassName 属性。

HTTP 处理程序的基类是 Page。这个类定义了由所有页面处理程序共享的方法和属性的最小集合。Page 类实现 IHttpHandler 接口。

在很多情况下,实际处理程序的基类并不是 Page,而是其他的类。例如,如果使用了代码分离,就会出现这种情况。代码分离是一项开发技术,它可以将页面所需的代码隔离到单独的 C# 和 Microsoft Visual Basic® .NET 类中。页面的代码是一组事件处理程序和辅助方法,这些处理程序和方法真正决定了页面的行为。可以使用 <script runat=server> 标记对此代码进行内联定义,或者将其放置在外部类(代码分离类)中。代码分离类是从 Page 继承并使用额外的方法的类,被指定用作 HTTP 处理程序的基类。

还有一种情况,HTTP 处理程序也不是基于 Page 的,即在应用程序配置文件的 <pages> 部分中,包含了 PageBaseType 属性的重新定义。

<pages PageBaseType="Classes.MyPage, mypage" />
PageBaseType 属性指明包含页面处理程序的基类的类型和程序集。从 Page 导出的这个类可以自动赋予处理程序扩展的自定义方法和属性集。

页面的生命周期
完全识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求。通常情况下,无需更改此方法的实现,因为它是由 Page 类提供的。

此实现将从调用为页面构建控件树的 FrameworkInitialize 方法开始。FrameworkInitialize 方法是 TemplateControl 类(Page 本身从此类导出)的一个受保护的虚拟成员。所有为 .aspx 资源动态生成的处理程序都将覆盖 FrameworkInitialize。在此方法中,构建了页面的整个控件树。

接下来,ProcessRequest 使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送到输出控制台。最后,卸载页面,并认为请求处理完毕。

在各个阶段中,页面会触发少数几个事件,这些事件可以由 Web 控件和用户定义的代码截取并进行处理。其中的一些事件是嵌入式控件专用的,因此无法在 .aspx 代码级进行处理。

要处理特定事件的页面应该明确注册一个适合的处理程序。不过,为了向后兼容早期的 Visual Basic 编程风格,ASP.NET 也支持隐式事件挂钩的形式。默认情况下,页面会尝试将特定的方法名称与事件相匹配,如果实现匹配,则认为此方法就是匹配事件的处理程序。ASP.NET 提供了六种方法名称的特定识别,它们是 Page_Init、Page_Load、Page_DataBind、Page_PreRender 和 Page_Unload。这些方法被认为是由 Page 类提供的相应事件的处理程序。HTTP 运行时会自动将这些方法绑定到页面事件,这样,开发人员就不必再编写所需的粘接代码了。例如,如果命名为 Page_Load 的方法绑定到页面的 Load 事件,则可省去以下代码。

this.Load += new EventHandler(this.Page_Load);
对特定名称的自动识别是由 @Page 指令的 AutoEventWireup 属性控制的。如果该属性设置为 false,则要处理事件的所有应用程序都需要明确连接到页面事件。不使用自动绑定事件的页面性能会稍好一些,因为不需要额外匹配名称与事件。请注意,所有 Microsoft Visual Studio® .NET 项目都是在禁用 AutoEventWireup 属性的情况下创建的。但是,该属性的默认设置是 true,即 Page_Load 等方法会被识别,并被绑定到相关联的事件。

下表中按顺序列出了页面的执行包括的几个阶段,执行的标志是一些应用程序级的事件和/或受保护并可覆盖的方法。

表 1:ASP.NET 页面生命中的关键事件

阶段 页面事件 可覆盖的方法
页面初始化 Init  
加载视图状态   LoadViewState
处理回发数据   任意实现 IPostBackDataHandler 接口的控件中的 LoadPostData 方法
加载页面 Load  
回发更改通知   任意实现 IPostBackDataHandler 接口的控件中的 RaisePostDataChangedEvent 方法
处理回发事件 由控件定义的任意回发事件 任意实现 IPostBackDataHandler 接口的控件中的 RaisePostBackEvent 方法 
页面显示前阶段 PreRender  
保存视图状态   SaveViewState
显示页面   Render
卸载页面 Unload  

以上所列的阶段中有些在页面级是不可见的,并且仅对服务器控件的编写者和要创建从 Page 导出的类的开发人员有意义。Init、Load、PreRender、Unload,再加上由嵌入式控件定义的所有回发事件,就构成了向外发送页面的各个阶段标记。

执行的各个阶段
页面生命周期中的第一个阶段是初始化。这个阶段的标志是 Init 事件。在成功创建页面的控件树后,将对应用程序触发此事件。换句话说,当 Init 事件发生时,.aspx 源文件中静态声明的所有控件都已实例化并采用各自的默认值。控件可以截取 Init 事件以初始化在传入的 Web 请求的生命周期内所需的所有设置。例如,这时控件可以加载外部模板文件或设置事件的处理程序。请注意,这时视图状态信息尚不可用。

初始化之后,页面框架将加载页面的视图状态。视图状态是名称/值对的集合,在此集合中,控件和页面本身存储了对所有 Web 请求都必须始终有效的全部信息。视图状态代表了页面的调用上下文。通常,它包含上次在服务器上处理页面时控件的状态。首次在会话中请求页面时,视图状态为空。默认情况下,视图状态存储在静默添加到页面的隐藏字段中,该字段的名称是 __VIEWSTATE。通过覆盖 LoadViewState 方法(Control 类的受保护、可覆盖方法),组件开发人员可以控制视图状态的存储方式以及视图状态的内容映射到内部状态的方式。

有些方法(如 LoadPageStateFromPersistenceMedium 以及其对应的 SavePageStateToPersistenceMedium),可以用来将视图状态加载并保存到其他存储介质(例如会话、数据库或服务器端文件)中。与 LoadViewState 不同,上述方法只能在从 Page 导出的类中使用。

存储视图状态之后,页面树中控件的状态与页面最后一次显示在浏览器中的状态相同。下一步是更新它们的状态以加入客户端的更改。处理回发数据阶段使控件有机会更新其状态,从而准确反映客户端相应的 HTML 元素的状态。例如,服务器的 TextBox 控件对应的 HTML 元素是 <input type=text>。在回发数据阶段,TextBox 控件将检索 <input> 标记的当前值,并使用该值来刷新自己内部的状态。每个控件都要从回发的数据中提取值并更新自己的部分属性。TextBox 控件将更新它的 Text 属性,而 CheckBox 控件将刷新它的 Checked 属性。服务器控件和 HTML 元素的对应关系可以通过二者的 ID 找到。

在处理回发数据阶段的最后,页面中的所有控件的状态都将使用客户端输入的更改来更新前一状态。这时,将对页面触发 Load 事件。

页面中可能会有一些控件,当其某个敏感属性在两个不同的请求中被修改时,需要完成特定的任务。例如,如果 TextBox 控件的文本在客户端被修改,则此控件将触发 TextChanged 事件。每个控件在其一个或多个属性被修改为客户端输入的值时都可以决定触发相应的事件。对于这些更改对其非常关键的控件,控件实现 IPostBackDataHandler 接口,此接口的 LoadPostData 方法是在 Load 事件后立即调用的。通过对 LoadPostData 方法进行编码,控件将验证自上次请求后是否发生了关键更改,并触发自己的更改事件。

页面生命周期中的关键事件是被调用以执行服务器端代码的事件,此代码与客户端触发的事件相关联。当用户单击按钮时,将回发页面。回发值的集合中包括启动整个操作的按钮的 ID。如果控件实现 IPostBackEventHandler 接口(如按钮和链接按钮),页面框架将调用 RaisePostBackEvent 方法。此方法的行为取决于控件的类型。就按钮和链接按钮而言,此方法将查找 Click 事件处理程序并运行相关的委托。

处理完回发事件之后,页面就可以显示了。这个阶段的标志是 PreRender 事件。控件可以利用这段时间来执行那些需要在保存视图状态和显示输出的前一刻执行的更新操作。下一个状态是 SaveViewState,在此状态中,所有控件和页面本身都将更新自己 ViewState 集合的内容。然后,将得到序列化、散列、Base64 编码的视图状态,而且此视图状态与隐藏字段 __VIEWSTATE 相关联。

通过覆盖 Render 方法可以改变各个控件的显示机制。此方法接受 HTML 书写器对象,并使用此对象来积累所有要为控件生成的 HTML 文本。Page 类的 Render 方法的默认实现包括对所有成员控件的递归调用。对于每个控件,页面都将调用 Render 方法,并缓存 HTML 输出。

页面生命中的最后一个标志是 Unload 事件,在页面对象消除之前发生。在此事件中,您应该释放所有可能占用的关键资源(例如文件、图形对象、数据库连接等)。

在此事件之后,也就是最后,浏览器接收 HTTP 响应数据包并显示页面。

小结
ASP.NET 页面对象模型因其事件机制而显得格外新颖独特。Web 页面由控件组成,这些控件既可以产生丰富的基于 HTML 的用户界面,又可以通过事件与用户交互。以前,在 Web 应用程序的上下文中设置事件模型是件有挑战性的工作。可我们惊奇的看到,客户端生成的事件可以由服务器端的代码来解决,而且只进行一些相应的修改后,此过程仍可以输出相同的 HTML 页面。

掌握这个模型对于了解页面生命周期的各个阶段,以及页面对象如何被 HTTP 运行时实例化并使用是非常重要的。

关于作者
Dino Esposito 是一位来自意大利罗马的培训教师和顾问。作为 Wintellect 团队的成员,Dino 专门研究 ASP.NET 和 ADO.NET,主要在欧洲和美国从事教学和咨询工作。此外,Dino 还负责管理 Wintellect 的 ADO.NET 课件,并为 MSDN 期刊的“Cutting Edge”专栏撰写文章。要与他联系,请向 dinoe@wintellect.com 发送电子邮件。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mt_sea/archive/2007/08/30/1765784.aspx

 

Master 模板页
Content 内容页
如果希望Master页面的数据传给Content页面,请OnInit
如果希望Content页面的数据传给Master页面,请重载OnLoad
具体细节不多说了,看下面页面的加载顺序就明白原因(对于使用MasterPage方式做网站的是很有用的)

  1. 母版页控件 Init 事件
  2. 内容控件 Init 事件
  3. 母版页 Init 事件
  4. 内容页 Init 事件
  5. 内容页 Load 事件
  6. 母版页 Load 事件
  7. 内容控件 Load 事件
  8. 内容页 PreRender 事件
  9. 母版页 PreRender 事件
  10. 母版页控件 PreRender 事件
  11. 内容控件 PreRender 事件
posted @ 2010-08-07 10:21 海风吹呀吹 阅读(318) 评论(0) 编辑
  2010年6月9日
代码
<%
db
="data.mdb" 
set conn=server.createobject("Adodb.Connection")
connstr
="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db)
conn.open connstr
set rs=server.createobject("adodb.recordset")
sql
="select * from 表"
rs.open sql,conn,
1,3
do while rs.eof=false
rs(
"字段一")=Html2Ubb(rs("字段一")) '在这里使用Html2Ubb函数将字段的数据转换成纯文本形式后写入数据库
rs("字段二")=Html2Ubb(rs("字段二"))
rs(
"字段三")=Html2Ubb(rs("字段二"))
rs.update
rs.movenext    
loop
rs.close
set rs=nothing
conn.close
set conn=nothing

 
Public Function Html2Ubb(ByVal strContent)
  
On Error Resume Next
  
If Len(strContent) > 0 Then
   
Dim re
   
Set re = New RegExp
   
   re.IgnoreCase 
= True
   re.Global 
= True
   
'--清除script脚本
   If CInt(ArrayCodes(0)) = 1 Then
    re.Pattern 
= "(<s+cript(.+?)<\/s+cript>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有iframe框架
   If CInt(ArrayCodes(1)) = 1 Then
    re.Pattern 
= "(<iframe(.+?)<\/iframe>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有object对象
   If CInt(ArrayCodes(2)) = 1 Then
    re.Pattern 
= "(<object(.+?)<\/object>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有java applet
   If CInt(ArrayCodes(3)) = 1 Then
    re.Pattern 
= "(<applet(.+?)<\/applet>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有div标签
   If CInt(ArrayCodes(4)) = 1 Then
    re.Pattern 
= "(<DIV>)|(<DIV(.+?)>)"
    strContent 
= re.Replace(strContent, "")
    re.Pattern 
= "(<\/DIV>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有font标签
   If CInt(ArrayCodes(5)) = 1 Then
    re.Pattern 
= "(<FONT>)|(<FONT(.+?)>)"
    strContent 
= re.Replace(strContent, "")
    re.Pattern 
= "(<\/FONT>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有span标签
   If CInt(ArrayCodes(6)) = 1 Then
    re.Pattern 
= "(<SPAN>)|(<SPAN(.+?)>)"
    strContent 
= re.Replace(strContent, "")
    re.Pattern 
= "(<\/SPAN>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有A标签
'
   If CInt(ArrayCodes(7)) = 1 Then
    re.Pattern = "(<A>)|(<A(.+?)>)"
    strContent 
= re.Replace(strContent, "")
    re.Pattern 
= "(<\/A>)"
    strContent 
= re.Replace(strContent, "")
'   End If
   '--清除所有img标签
   If CInt(ArrayCodes(8)) = 1 Then
    re.Pattern 
= "(<IMG(.+?)>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有FORM标签
   If CInt(ArrayCodes(9)) = 1 Then
    re.Pattern 
= "(<FORM>)|(<FORM(.+?)>)"
    strContent 
= re.Replace(strContent, "")
    re.Pattern 
= "(<\/FORM>)"
    strContent 
= re.Replace(strContent, "")
   
End If
   
'--清除所有HTML标签
   If CInt(ArrayCodes(10)) = 1 Then
    re.Pattern 
= "<(.[^>]*)>"
    strContent 
= re.Replace(strContent, "")
   
End If
   re.Pattern 
= "(" & Chr(8& "|" & Chr(9& "|" & Chr(10& "|" & Chr(13& ")"
   strContent 
= re.Replace(strContent, vbNullString)
   re.Pattern 
= "(<!--(.+?)-->)"
   strContent 
= re.Replace(strContent, vbNullString)
   re.Pattern 
= "(<TBODY>)"
   strContent 
= re.Replace(strContent, "")
   re.Pattern 
= "(<\/TBODY>)"
   strContent 
= re.Replace(strContent, "")
   re.Pattern 
= "(<" & Chr(37& ")"
   strContent 
= re.Replace(strContent, "<%")
   re.Pattern 
= "(" & Chr(37& ">)"
   strContent 
= re.Replace(strContent, "%>")
   Set re = Nothing
   Html2Ubb = strContent
  Else
   Html2Ubb = ""
  End If
  Exit Function
 End Function
%> 

 4

 

posted @ 2010-06-09 17:09 海风吹呀吹 阅读(32) 评论(0) 编辑
  2010年5月21日
摘要: Unable to start debugging on the web server. The IIS worker process for the launched URL is not currently running.解决办法,右键你建立的网站,选择编辑绑定,把IP地址改为“全部未分配”!问题解决参考老外给的答案:According to others, if y...阅读全文
posted @ 2010-05-21 14:46 海风吹呀吹 阅读(133) 评论(0) 编辑
  2009年6月17日
摘要: 数据库设计的5种常见关系,其中本文主要讲“多态”关系结构,以手机为例。 1,配置关系--和其他表无任何关系的表。 例如:webConfig里的东西你存储到表里。 2,一对多关系,一张表包含另外一个表的主键作为外键。 例如:手机.品牌id=2,这里的2是[品牌名称表]的id字段为2的纪录,品牌名称是"Nokia"。一个手机只能有一个品牌。 3,多对多,需要3张表,有一个包含两...阅读全文
posted @ 2009-06-17 09:53 海风吹呀吹 阅读(69) 评论(0) 编辑
  2008年3月2日
posted @ 2008-03-02 10:59 海风吹呀吹 阅读(725) 评论(0) 编辑
  2008年1月29日
摘要: 在线编辑器的使用和配置可以说在所有的在线编辑器中,FCKeditor是目前互联网上最好的编辑器,功能强大,支持多种浏览器,无平台限制,可以和多种WEB语言融合,多语言支持,开源等~~ 对于一个全新的网站,FCKeditor就可以直接拿过来用了,不需要进行什么修改。但是对于绝大多数的已有网站而言,FCKeditor的一些设置并不适合自己的使用,这篇文章旨在告诉你简单的修改FCKeditor以方便您的...阅读全文
posted @ 2008-01-29 10:28 海风吹呀吹 阅读(1821) 评论(2) 编辑