POSTBACK的问题:
Page的IsPostBack属性用来解决此问题.由于Page_Load在每次页面加载时运行,其中的代码即使在回送
(PostBack)的情况下也会执行.这在一般情况下不需要或者不允许的.
页面处理步骤:
1 服务器往返:
服务器负责动态创建页面并把页面传递给客户端.而客户端负责给出信息和从用户那里获取信息,同时
有选择的执行某个客户端脚本.在asp.net中将信息在服务器客户端之间传递是依靠http请求实现.
2 ViewState:
Web Forms的核心是无状态的HTTP通信.这意味着服务器并不保留有关以前客户请求的任何信息.这也
意味着每次在往返执行的过程中重新创建页面时,服务器往往要做大量的额外工作,而web forms的做法是
使用ViewState. 页面在服务器的两次请求之间存贮自己的ViewState.ViewState包含了页面上所有用户
控件的状态.通过使用System.Web.UI.StateBag 对象,此信息被存贮成名称-值对.页面中的viewstate被
存贮为隐藏的表单字段.
例如: <input type="hidden" name="_VIEWSTATE" value="......"/>
web forms读取viewstate并将该页面提交给服务器时恢复服务器控件的值.有点是页面的状态与页面一
起存贮,而不是存贮在服务器中.缺点是在复杂的页面中viewstate的内容可能会增大以致开始影响页面下
载的速度.
注:默认情况下所有服务器控件都支持viewstate.当然也可以将页面级的viewstate关闭--不保存页面的
任何控件的状态.实现:
<%@ Page EnableViewState="false" %>
基于逐步控制的思想,对某个控件要想实现viewstate,可以这样:
<asp:DropDownList id="ship" EnableViewState="false" runat="server"/>
3 页面处理步骤
a.配置阶段
如果是进行回送操作,那么页面和控件的viewstate随后就会恢复.恢复之后系统就会激发Page_Load
事件.
b. 事件处理阶段
c.显示阶段
d.清除阶段
此阶段首先发生的事件是Page_Unload,应该完成的工作有:关闭任何打开的数据库连接,任何已打开
的文件以及删除任何用于页面的对象(大多情况下是对象引用).
4 web表单事件
和传统事件驱动编程模型中所使用的事件不同,尽管仍然可以使用在客户端中出现并被处理的事件(
就像服务器中出现并被处理的事件一样),但主要的web form 事件模型适用于出现在客户端但在服务器中
进行处理的事件.这种控制转移是通过使用http post实现的.
事件出现:
有几个服务器控件如:Repeater,DataList和DataGrid这样的控件都可以包含其它自控件.这些子控
件并不会主动产生自己的事件以在页面中进行处理.实际情形是,容器(即父控件)将事件打包,并将其作为
ItemCommand事件传递到页面中.因此在Repeater中单击某个按钮时就会激发该事件.
例如:
<script language="c#" runat="server">
void "MyRepeater"_ItemCommand(Object Sender,RepeaterCommandEventArgs e)
{
ClickInfo.Text = "You selected the"+((Button)e.CommandSource).Text+"button<br>";
}
</script>
注:第一个参数sender是对产生事件的服务器控件的引用.也就是说,根据sender变量的值可以知道具体是
哪个控件.
第二个参数是一个包含了一组有关特定事件的信息的对象.例中CommandSource属性表示对实际产生事
件的子服务器控件的引用.
客户端和服务器上的事件处理:
基本上,服务器控件所支持的事件都在服务器上处理.而所有可由html input控件都需要在客户端上处
理.但是当存在一个既能在服务器又能在客户端处理的事件时,该事件会优先在服务器上执行.
页面状态:
除了隐藏的表单字段ViewState或者Session 对象中可以存贮信息,State Bag也是另一种选择:
例如:
void Page_Load(Object Sender,EventArgs e)
{
int viewCount;
if(ViewState["viewCount"]!=null)
{
viewCount = (int) ViewState["viewCount"]+1;
}
else
viewCount = 1;
labelView1.Text = "Times page has been viewed"+viewCount.ToString();
ViewCount["viewCount"] = viewCount;
if(!IsPostBack)
{
ArrayList values = new ArrayList();
......
}
}
ViewState对象是一个由页面维护的状态集合.当然可以将自己的关键字添加到该集合中,而且该值将和
所有服务器控件的状态一起在页面中保留下去.
下面是有关页面指令的内容:
1 @Page指令
主要属性:
AspCompat 将页面设置为在Single-thread Apartment(STA组件??) 中运行.(不懂!!)
AutoEventWireup 页面事件是否自动激发.若为false,则象page_load这样的事件必须由开发人员激活
Buffer 激活响应缓冲功能
ClassName 派生该页面的类名称
ClientTarget 页面所指向的浏览器(有点不懂)
ContentType 设置响应的内容类型*
Debug 用激活的调试功能编译页面
Description 页面的描述--asp.net将其忽略
EnableSessionState 页面有权访问Session对象,ReadOnly--页面只能对Session对象执行读操作,不
能改变Session变量
EnableViewState 为服务器控件保持的页面级ViewState(前面已就此问题分析过)
EnableViewStateMac 验证viewstate是否被客户端窜改
ErrorPage 出现错误时重定向页面
Inherits 该页面继承的代码后置类
Language 这个就不说了,地球人都知道....
ResponseEncoding 由响应发送的文本的编码格式
SmartNavigation 这个不太懂...
Src 该页面所使用的代码后置类的文件名称
Trace 激活页面执行的追踪(默认false)
...
2 @Import 指令
用来导入一个名称空间.
<
%@Import
namespace="value" %>
自动导入的空间:
system system.web
system.collection.specialized system.web.security
system.io system.web.ui
system.text.regularexpression system.web.ui.webcontrols
system.collections system.web.caching
system.configuration system.web.sessionstate
system.text system.web.ui.htmlcontrols
3 @Implements指令
用来在页面中实现一个.NET接口.
注:要确保自定义控件能够象标准服务器控件那样对事件作出相应,我们的控件就必须实现
IPostBackEventHandler 接口!!*
<
%@Implements
Interface="System.Web.UI.IPostBackEventHandler"%>
4 @Register指令
两种形式:
<
%@Register
tagprefix="tagprefix" Tagname="tagname" Src="pathname"%>
<
%@Register
tagprefix="tagprefix" Namespace="namespace" Assembly="assembly"%>
书看到这,产生一点疑问:第一种形式针对用户控件,第二种针对自定义控件.那么用户控件和自定义
控件到底有何区别???
5 @Assembly指令(不懂!)
用于直接引用一个装配件.
6 @OutoutCache指令(P149)(也不懂)
用来对页面在服务器上如何进行高速缓存进行控制.
7 @Reference 指令
识别当前页面在运行时间应该动态编译和链接的页面或控件.这意味着在运行时允许将用户控件(?)
动态添加到页面中.(应该与page对象的LoadControl方法结合起来使用!)
代码后置:
原来方法: 代码内联 (程序代码与Html代码混合在一个文件中)
原则是为代码创建一个类,并从asp.net page对象中继承该类.
规则: a名称空间--System
System.Web.UI //用于创建一个继承自Page对象的类
System.Web.UI.WebControls //用于引用控件
System.Data.SqlClient //用来访问SQL Server
...
b要创建一个继承自page的类.在此类中,保证Web控件的变量名与页面中asp.net服务器控件的
名称相同!!
在asp.net页面中继承代码后置类文件:
<
%@Page
Inherits="class_name" Src="path_to_class_file" %>
注:要使用正确的文件扩展名!!
另一种形式:
<
%@Page
Inherits="ShipMethodClass" %>
此时,asp.net假设此类是预先编译过的,而且位于应用程序的bin目录中.