然后执行的方法是AddParsedSubObject。在Temporary ASP.NET Files中页面对应生成源代码文件中(.cs/.vb)可以看到在创建页面控件树的时候(如:__BuildControlTree)调用了这个方法将已经解析完成的子空间添加进入控件树。这个方法可以被重写(override),比如将一些控件添加到指定页面模板的特定位置。这个方法将页面上所有控件(静态控件)以树的形式添加进来,而且树的建立是从最底层开始的。
ProtectedOverridesFunction DeterminePostBackMode()Function DeterminePostBackMode() As System.Collections.Specialized.NameValueCollection Return (Request.Form) End Function
接着执行的是OnInit方法,这个方法通常是编程中最先使用的方法(对应的函数签名为:Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init)。在这个方法执行前页面所有定义的控件(静态控件)都已经初始化完毕。这个时候所有静态控件都已经被赋了初始值(如:页面上有一个TextBox1,并在属性中将其Text属性设置为“Hello World”,那么无论页面回传了多少次,无论TextBox1中的Text被修改了多少次,那么在这个时候TextBox1.Text一定为“Hello World”。这一点可以通过在Page_Init方法中取TextBox1.Text属性来验证。)所以在OnInit阶段,ViewState的值和回传的值(Post Back Data)都还没有被赋值到对应的控件上。OnInit阶段是创建/重新创建动态控件(Dynamic Control)的最好时机。
接下来执行的是ProcessPostData方法,这个方法也仅仅是在页面回传的时候(Post Back)执行。由于此方法是Page类中的一个私有方法,所以不能被派生类所重写。从方法的名称可以看出这个方法是用来处理页面最后一次回传的数据的,就是前面所提到的名值对信息。在这个方法中,通过将控件的ID(实际应该是控件的名称属性[name],这里是针对服务器端的控件属性,在将服务器端控件解析成对应的客户端HTML控件时,对于需要回传值的控件,ASP.NET会自动为其生成一个name属性,其值和服务器端控件的ID值相等[这里不考虑作为另外一个控件子控件的情况,因为如果作为子控件那么其name属性前面有时会增加父控件的name值作为前缀])和回传服务器名值对中的Key相匹配,然后将对应的控件状态和值更新为最新值。到此为止,这个页面就已经完成了数据载入的全部工作(已经是最新的值了)。值得注意的是动态生成的控件必须在这个方法调用前生成,因为只有执行了这个方法,通过比较ViewState的值(最后一次回传以前的值)和当前回传的值(Post Back Data)之间的不同才可以触发对应控件的变更事件(changed events,如:TextBox.TextChanged事件)
然后执行的就是大名鼎鼎的OnLoad事件。Page_Load函数写ASP.NET的Coder都知道。由于在前面的各个阶段完成以后页面上各个控件的值已经完全被恢复了,所以很多代码都通过Page.IsPostBack的值来判断页面是否是回传页面,从而减少不必要的操作(或者说仅仅只需要在第一次页面执行或者仅仅对页面回传的时候才能进行的操作)。同时你也可以在此时验证控件数据的有效性。同样的你也可以在这个阶段创建动态控件,事实上我们常常会这样做。在动态控件被创建(New)了以后,这个控件将会重新执行前面提到了的除了ProcessPostData方法之外的所有方法,以便和其他控件的状态保持一致(executed to catch up, 赶上控件的执行进度)。因为不执行ProcessPostData方法那么此时动态创建的控件仍旧是ViewState的值而不会是最新值,此时它们也不会触发更改事件(Changed events) 。
触发事件(Raised Events)
接着执行的方法是ProcessPostData, 实际上这是第二次执行这个函数(第一次执行是在OnLoad方法执行前)。同样这个方法也是仅仅在页面回传的时候(Post Back)才会执行。这个方法在页面周期中执行两次往往让人觉得奇怪。这个方法再次被调用执行主要是出于对OnLoad事件中动态生成的控件赋回传值(Post Back Data)的目的,并且使其可以触发对应的变化事件(Changed events)。如果在这个方法以后再动态创建的控件(最后的机会),那么动态生成的控件由于生成进度的追赶(executed to catch up, 赶上控件的执行进度)仍然会被赋予ViewState中的值,但是将不会被得到页面回传的值(Post Back Data)同时也不会触发其所有的变化事件(Changed events)。这里需要提一下的是,在设计页面生命周期的时候在OnLoad事件的前面和后面执行ProcessPostData是必要。第一次执行是为了保证在此之前所有控件的状态已经更新为最新值,因为这些控件的可能会在OnLoad事件中被使用。而第二次调用仅仅是为了保证在OnLoad中生成的动态控件可以被赋予回传的值,并能正确的触发变化事件(changed evetns)。实际上个人感觉这样的设计也是一种补救的方法,因为毕竟从页面的后台代码直观的看Page_Load是我们能操作的第一个事件方法,也是用的最频繁的方法。我们在后续的阶段中依然可以动态的创建控件,但是这些控件就会存在一些先天性的缺陷了。:)
接着被调用的方法是RaiseChangedEvents,这个方法也仅仅在页面回传以后才会被触发执行,并且由于它是一个Page类的一个私有方法所以也无法被重写。这个时候控件的变化事件(Changed events)将被触发。通过Reflector查看ProcessPostData的源代码可以发现在函数执行的过程中,系统会比照控件的ViewState值和页面最后一次的回传值(Post Back Data),如果两个值之间存在不同那么此控件将会被加入到一个需要触发变化事件的控件列表中。在这里系统再去读取这个控件列表然后一个个的触发控件的变化事件(Changed events)。但是控件的触发顺序是没有保证的,所以如果某个变化事件响应函数中的代码中需要使用其他控件变化事件响应函数中产生的结果,这样的代码是不能保证被正常执行的。但是可以肯定的是Changed events要比其他类型的事件先执行,如:Button.Click事件。
下一个执行的是OnPreRender方法,这个方法是最后可以对页面和其中的所有控件进行操作的地方。你在这个阶段依然可以动态的生成页面控件,所有控件生成周期都会被执行(追赶加载),包括ViewState也会被赋值到对应的动态控件中,但是早期的那些私有方法(ProcessPostData, RaiseChangedEvents, RaisePostBackEvent)将不会被执行。这就意味着页面最后一次回传的值将不会影响页面上的控件,并且所有控件的事件(变化类事件Changed events 和回传事件PostBackEvents)都不会被触发。(This is a good place to catch a PostBack without an event due to the bug noted in IE)
保存ViewState值和页面渲染(Save and Render)
接着被执行的方法是SaveViewState,这个方法将在每次页面的生命周期都被调用执行(无论页面是否是回传还是第一次被请求)。SaveViewState方法通过递归的方法遍历每个控件自身和其所有子控件,并将它们的ViewState进行保存。一般地,(ViewState basically stores any property values that are different from the original values that are defined in the aspx page) ViewState会保存页面(.aspx)中定义的所有控件属性中和上一次回传值不一致的值,无论这个值是通过代码进行修改的还是通过用户在页面上修改的。值得注意的是ViewState的值是根据控件在页面整个控件树中的位置进行保存的,所以如果动态控件如果被加入到了页面控件树的错误位置可能会导致页面ViewState在保存的时候出现异常情况。
Paul Wilson is a software architect in Atlanta, currently with a medical device company. He specializes in Microsoft technologies, including .NET, C#, ASP, SQL, COM+, and VB. His WilsonWebForm Control allows Multiple Forms and Non-PostBack Forms in ASP.NET. He is a Microsoft MVP in ASP.NET and is also recognized as an ASPFriend's ASPAce/ASPElite. He is a moderator on Microsoft's ASP.NET Forums, as well as one of the top posters. He is certified in .NET (MCAD), as well as also holding the MCSD, MCDBA, and MCSE. Please visit his website, www.WilsonDotNet.com, or email him at [email protected]
在客户端访问subversion版本库时出现这个错误:
svnserve.conf:12: Option expected
为什么会出现这个错误呢,就是因为subversion读取配置文件svnserve.conf时,无法识别有前置空格的配置文件,如### This file controls the configuration of the svnserve daemon, if you##
什么是Akka
Message-Driven Runtime is the Foundation to Reactive Applications
In Akka, your business logic is driven through message-based communication patterns that are independent of physical locatio
zabbix_api网上比较多的写法是python或curl。上次我用java--http://bossr.iteye.com/blog/2195679,这次用perl。for example: #!/usr/bin/perl
use 5.010 ;
use strict ;
use warnings ;
use JSON :: RPC :: Client ;
use
package com.test;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestMap {
public static v
MySQL server has gone away 问题解决方法,需要的朋友可以参考下。
应用程序(比如PHP)长时间的执行批量的MYSQL语句。执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段。比如,图片数据的处理。都容易引起MySQL server has gone away。 今天遇到类似的情景,MySQL只是冷冷的说:MySQL server h
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml&