bs/cs 的区别

ASP.NET的Page.IsPostBack 属性

  现在从对ASP.NET页面的执行顺序开始,体会一下B/S结构的程序的特点,下面是ASP.NET页面的执行顺序说明:

  Page_Init(页面初始化引发的事件)——>Page_Load(加载页面时引发的事件)——>Control   Event(服务器控件引发的事件)——>Page_UnLoad(页面从内存中卸载时引发的事件)

  Page_Init和Page_UnLoad不常用,但是这里还是要说明一下。Page_Init和Page_Load事件区别在于,只有后者才能完全加载控件,绑定数据,虽然你可以在Page_Init中访问控件,但是其viewstate都不会被加载,所以此时控件中只拥有默认值。

  这里说到了viewstate,我们先来做一个大致的了解——其实在ASP.NET中有两个viewstate。一个是控件本身的,用来维护控件自己的一些状态,比如说某个空间有变色的功能,它的viewstate就维护这个功能,这个viewstate是不能被用户访问的。相信自己写过控件的朋友都会有这样的感觉,自己写控件当然也要用自己的一个viewstate来维护这个控件的状态;而另外一个viewstate,是用户使用的,这个 viewstate和Session几乎一模一样,必须要先对其进行定义,才能使用。

  每当点击ASP.NET的Web网页上的Button、LinkButton或ImageButton等控件时,表单就会被发送到服务器上。如果某些控件的AutoPostBack属性被设置为true,那么当该控件的状态被改变后,也会使表单会发送回服务器。?(AutoPostBack属性,它只有两个bool值,true/false。如果这个属性被设置成false,那么点击后就不会立刻将变化传给服务器处理,也就不会有该控件的 SelectedIndexChanged事件。)

  每次当表单被发送回服务器,就会被重新加载,启动Page_Load事件,执行Page_Load事件处理程序中的所有代码(注意,是每次都会执行!)。
很显然把网页的初始化代码放在这里是最合适不过。我们经常会希望在每次加载网页时执行一些代码,如一些控件的数据绑定。

  当我们希望只有在网页第一次加载时执行另一些代码(基本上都是数据的默认绑定),甚至希望一些代码在除首次加载外的每次加载时执行。那么我们可以利用IsPostBack特性来完成这一功能。在网页第一次加载时,该属性的值是false。如果网页因回送而被重新加载,IsPostBack属性的值就会被设置为true。

  在ASP.NET应用程序中,如果需要在页面第一次显示时执行一些初始化操作,必须判断IsPostBack属性!

  在ASP.NET使用Page.IsPostback,那么就可以避免往返行程上的额外工作:如果处理服务器控件回发,通常需要在第一次请求页时执行代码,该代码不同于激发事件时用于往返行程的代码。如果检查?Page.IsPostBack?属性,则代码可按条件执行,具体取决于是否有对页的初始请求或对服务器控件事件的响应。这样做似乎很明显,但实际上可以忽略此项检查而不更改页的行为。该属性用的好坏,直接关系到你程序运行是否按照你最初的意愿,也关系到整个页面的效率。因为,如果每次都会给控件绑定数据,不管你是第一次访问,还是提交了数据以后,那么这个页面程序的效率可想而知。

  一个B/S结构的页面每一次提交,它都会重新从头到尾执行一次。而C/S结构的程序就不会这样,这是和C/S结构的程序最大的区别!其实,得不到控件的数据,都是因为这个原因。

    //当年我回答:bs/cs的主要区别是cs的事件触发和事件处理都在客户端完成,而bs的事件触发是在浏览器端,事件处理实在服务器端,汗颜 added by zhangjun at 2011-01-20

  //补充一段学习asp.net常用内置变量的代码,这也是bs/cs的区别

using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using ESRI.ArcGIS.Server;
using ESRI.ArcGIS.Geodatabase;
using System.Windows.Forms;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        //加载页面,首先执行此方法,然后才是其他的事件处理方法
        i = 0;
        if (IsPostBack)
        {
            //request.cookies 读取客户端cookies
            if (Request.Cookies["text2"].Value != null)
            {
                TextBox2.Text = Request.Cookies["text2"].Value;
            }
        }
        if (Session["ok"] == null)
            return;
        TextBox3.Text = Session["ok"].ToString();
      
    }

    protected void UploadButton_Click(object sender, EventArgs e)
    {
        ///'遍历File表单元素
        HttpFileCollection files = HttpContext.Current.Request.Files;

        /// '状态信息
        System.Text.StringBuilder strMsg = new System.Text.StringBuilder("您输入的用户名是:" + TextBox1.Text + "<br/>");
        strMsg.Append("上传的文件分别是:<hr color='red'/>");
        try
        {
            for (int iFile = 0; iFile < files.Count; iFile++)
            {
                ///'检查文件扩展名字
                HttpPostedFile postedFile = files[iFile];
                string fileName, fileExtension;
                fileName = System.IO.Path.GetFileName(postedFile.FileName);
                if (fileName != "")
                {
                    fileExtension = System.IO.Path.GetExtension(fileName);
                    strMsg.Append("上传的文件类型:" + postedFile.ContentType.ToString() + "<br>");
                    strMsg.Append("客户端文件地址:" + postedFile.FileName + "<br>");
                    strMsg.Append("上传文件的文件名:" + fileName + "<br>");
                    strMsg.Append("上传文件的扩展名:" + fileExtension + "<br><hr>");
                    ///'可根据扩展名字的不同保存到不同的文件夹
                    ///注意:可能要修改你的文件夹的匿名写入权限。
                    postedFile.SaveAs(System.Web.HttpContext.Current.Request.MapPath("images/") + fileName);
                }
            }
            strStatus.Text = strMsg.ToString();
        }
        catch (System.Exception Ex)
        {
            strStatus.Text = Ex.Message;
        }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (HiddenField1.Value == String.Empty)
            HiddenField1.Value = "0";

        HiddenField1.Value = (Convert.ToInt32(HiddenField1.Value) + 1).ToString();
        Label1.Text = "点击button次数为:"+HiddenField1.Value;
    }

    private int i;
    protected void Button2_Click(object sender, EventArgs e)
    {
        //使用变量i,由于每次都会执行Page_Load,所以不能保存i的值
        //体现了bs和cs的区别,http协议是无状态的,而cs启动之后定义的变量在内存中保留
        i = i + 1;
        Label1.Text = "点击button次数为:"+ i.ToString();
    }

    protected void Button4_Click(object sender, EventArgs e)
    {
        //response.cookies 写入客户端cookies
        //每个客户端独有的值,存放在客户端(小于4k的txt文件中)
        Response.Cookies["text2"].Value = TextBox2.Text;

    }
    protected void Button5_Click(object sender, EventArgs e)
    {
        //每个客户端独有的对象,存放在服务器端(内存中或数据库中)
        //有点像 局部变量
        Session["ok"] = "ok";
    }
    protected void Button6_Click(object sender, EventArgs e)
    {
        //所有客户端共享的对象,存放在服务器端(内存中或数据库中)
        //有点像 全局变量
        Application["fine"] = "good";

    }
}

原文地址:https://www.cnblogs.com/zhangjun1130/p/1940350.html