• 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";

        }
    }

  • 相关阅读:
    Convolutional Neural Network-week1编程题(一步步搭建CNN模型)
    Coursera Deep Learning笔记 卷积神经网络基础
    爬取b站周杰伦新歌mv弹幕 绘制词云
    Coursera Deep Learning笔记 结构化机器学习项目 (下)
    Golang-执行go get私有库提示”410 Gone“ 解决办法
    golang常用的http请求操作
    关于asyncio知识(四)
    关于asyncio知识(二)
    Python Every Class Needs a __repr__
    关于asyncio知识(一)
  • 原文地址:https://www.cnblogs.com/zhangjun1130/p/1940350.html
Copyright © 2020-2023  润新知