bs/cs 的區別

來源:互聯網
上載者:User
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";

    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.