您的位置:首页 > 编程语言 > ASP

ASP.Net WebForm学习笔记:一、aspx与服务器控件探秘

2015-09-23 14:03 826 查看
作者:周旭龙

出处:http://edisonchou.cnblogs.com

开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行走于天下。但这样真的就可以走一辈子吗?实际上,ASP.Net经常被喷的诟病就在于WebForm以及只会拖控件的ASP.Net程序员,往往大型互联网系统也没有采用WebForm的模式进行开发。但是,WebForm并不是一无是处,而是我们没有用好,还有很多东西我们知其然不知其所以然,现在我们就来对这些平时所不注意但又十分关键的东西一探究竟。


一、神秘不神秘—aspx探秘

1.1 WebForm时代的请求对象

View
Code

  其后台代码.cs文件代码如下:

View
Code

  (1)CodeBehind:在每个aspx文件中的头部,我们都会看到以下的一句代码

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FirstPage.aspx.cs" Inherits="WebFormDemo.FirstPage" %>


  其中CodeBehind这个属性定义了此aspx页面的专属后台代码文件的名称,而Inherits这个属性则定义了此aspx页面所要继承的父类的名称(这也可以简单地说明,aspx页面会单独生成一个类,与后台代码类不重合在一起)。因此,aspx.cs就是aspx的后置处理代码,负责处理aspx中<%%>和runat="server"的内容。

  (2)子类与父类:我们使用ASP.NET写的网站在运行时候都会被编译生成为一个一个的程序集(.dll),而我们的aspx页面也会被生成为一个一个的类。那么,我们如何来证明aspx会生成一个类,而且还是aspx.cs中的类的子类呢?那么,我们需要反编译系统所生成的程序集(.dll)文件。

  第一步:找到网站所生成的程序集

  我们可以通过写入以下代码,然后在aspx中<% GetDllInfo(); %>调用;

View
Code

  在上面的Button控件中,既设置了OnClientClick也设置了OnClick服务端事件,浏览生成的页面源代码,可以看到在生成的html中,OnClientClick确实是渲染成了input的onclick这个浏览器端的事件:在Button每次以POST方式向服务器提交请求之前,都会先进行checkConfrim这个方法的判断,如果返回值为true才会将请求提交到服务器端;

View
Code

  有一个省市两级联动的下拉列表场景,在用户选择一个省份后,自动从服务器获取属于该省份的市名下拉列表。这里使用了DropDownList控件,该控件提供了一个叫做SelectIndexChanged的事件,它会帮我们渲染生成select的onchange的浏览器事件。但是在页面的浏览过程中,我们怎么选择不同的省份,市名称的下拉列表就是不动,因为没有向服务器提交数据请求。

  ①这时候,一位名叫MSDN的大神会告诉你,需要给这个DropDownList控件设置一个AutoPostBack="true"的属性,经调试后果然可行了。但是,作为一个学习者,我们会想知道到底这个AutoPostBack帮我们做了什么事儿?这时,我们可以通过查看浏览器的源代码一探究竟。



  ②通过浏览器提供的开发人员工具查看数据请求报文,可以看到除了提交form中的input外,还提交了ASP.Net WebForm预置的一些隐藏字段,而这些隐藏字段则是WebForm为我们提供便利的基础。比如EventTarget则记录刚刚提交给服务器的是哪个服务器控件。



2.4 为什么需要IsPostBack

  注:WebForm页面中如果有一个runat="server"的form,那么必定会涉及到IsPostBack。

  (1)Http的无状态:因为Http是无状态的,所以这次会话结束下次再给我提交请求我也不记得你是谁,即使你是李刚的儿子,老子也不认识。那么,为了解决这种问题,我们可以使用一些方法来解决,例如设置一个隐藏字段来判断,如果是PostBack那么肯定请求报文中会带上这个字段,如果不是那么请求报文中肯定没有这个字段。比如,下面我们使用隐藏字段来作为判断PostBack的标志。

<input name="IsPostBack" type="hidden" value="true" />


  (2)ASP.Net WebForm中内置了一个IsPostBack属性(bool类型),我们可以在Page_Load事件中判断IsPostBack是否为true,如果不为true则可以知道是第一次访问或者是请求页面的操作,而如果为true则代表是PostBack操作,我们可以分别进行不同的业务逻辑处理。例如:有的代码只会在页面第一次加载时才执行(比如从数据库中读取数据并显示),这时就应该使用IsPostBack进行判断。



if (!IsPostBack)
{
this.lblInfo.Text = "第一次来,不是PostBack";
}
else
{
this.lblInfo.Text = "非第一次来,是PostBack";
}




  (3)通过查看生成的页面html代码,我们没有发现页面中有IsPostBack的这个隐藏字段。那么,它是存储在哪个位置又是根据什么来判断的呢?实际上,IsPostBack属性是根据ViewState中的一些特殊的键值对来判断赋值的(因为:每次提交请求后,服务器端都会返回不同的ViewState隐藏域给浏览器端;同样,浏览器每次也会将ViewState提交给服务器端,服务器端会解析ViewState还原上次状态)。对于ViewState,可以通过一些软件例如ViewStateDecoder进行解析查看,例如下图:



  如果我们禁用了ViewState,那么也就无法正常使用IsPostBack属性了,也无法正常使用PostBack了。那么对于ViewState,我会在下一篇进行简单探秘,本篇就到此为止。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: