第二天

来源:互联网 发布:centos 7 邮件服务器 编辑:程序博客网 时间:2024/04/28 08:06

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目录中.

原创粉丝点击