禁用viewstate

<asp:Dropdownlist/>禁用viewstate以後


public partial class _Default : System.Web.UI.Page
    {
        protected override void OnPreInit(EventArgs e)
        {

List<string> list = new List<string>();
            list.Add("1");
            list.Add("2");
            list.Add("3");
            list.Add("4");
            list.Add("5");
            list.Add("6");
            list.Add("7");
            list.Add("8");
            list.Add("9");
            list.Add("0");
            drop1.DataSource = list;
            drop1.DataBind();

            //int count = drop1.Items.Count;
            base.OnPreInit(e);
            base.OnPreInit(e);

        }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
        }

        //protected override void LoadViewState(object savedState)
        //{
        //    base.LoadViewState(savedState);
        //}

        //ProcessPostData()

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                //List<string> list = new List<string>();
                //list.Add("1");
                //list.Add("2");
                //list.Add("3");
                //list.Add("4");
                //list.Add("5");
                //list.Add("6");
                //list.Add("7");
                //list.Add("8");
                //list.Add("9");
                //list.Add("0");
                //drop1.DataSource = list;
                //drop1.DataBind();
            }
            else
            {
                string txt = drop1.SelectedValue;
            }
        }

        protected void drop1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }問題:1。
服務端代碼中綁定下拉框的數據源。爲什麼禁用viewstate以後drop1.SelectedValue的到得值空的?

答:回發得到的回發的時候,void LoadViewState(object savedState)在這裏有一個分析viewstate的過程,過程1,把viewstate解析給drop1的

datasoure屬性.過程2,然後drop1.selectedValue = request.form["drp1"].這樣我們就能夠通過drop1.selectedValue獲取到我們選中的值了


但是當我們把viewstate禁用掉以後發現,1過程已經不能把viewstate付給datasource屬性了,這樣drop1一個值也沒有,然後2步驟將我們選中的

值賦給一個空的drop,drop根本找不到與其對應的索引,因爲它是空的。這樣我們再用drop1.selectedValue的時候它是一個空值。

問題:2
若下拉框的數據源綁定不是在服務端編碼實現的,而是在服務端通過在頁面的標籤裏面進行了賦值。列如:
<asp:DropDownList runat="server" ID="drop1" AutoPostBack="true" EnableViewState="false"
            OnSelectedIndexChanged="drop1_SelectedIndexChanged">
            <asp:ListItem Text="春" Value="1">
            </asp:ListItem>
            <asp:ListItem Text="夏" Value="2">
            </asp:ListItem>
        </asp:DropDownList>
這個時候我們禁用viewstate的時候發現drop1.SelectedValue能夠獲取到客戶端選中的值.這個時候又是爲什麼?

答:在在服務端通過在頁面的標籤裏面進行賦值,其實在請求到達void OnPreInit(EventArgs e)這個方法的時候,asp.net有一個
生成控件樹的過程,然後對.aspx頁面中的每個控件都進行了初始化。也就是說drp1的datasource屬性這個時候已經有值了,
如果不相信,我們可以初次請求的時候,在void OnPreInit(EventArgs e)這個最早的階段看下drop1的數量.代碼如下;
protected override void OnPreInit(EventArgs e)
        {

            int count = drop1.Items.Count;//顯示2
            base.OnPreInit(e);

        }
回發的時候,我們按照問題1中的講解的void LoadViewState(object savedState)對SelectedValue賦值的事情,這個時候
datasource屬性不是空的,當然就可以把客戶端的返回值,賦給selectedValue了。
(另外一個大家需要知道的是,
1.服務端的.aspx頁面進行初始化,viewtate是不會被記錄的,所以我們查看客戶端的viewtate其實也是沒有drop中所包含的信息的.
2.如果我們對下拉框的賦值是通過客戶端進行的,也就是Js.那我們在回發的時候發現SelectedValue的值也是空的,其實我們也可以通過問題1

可以來解釋。客戶端賦值這裏就不涉及到一個裝載和解析viewstate的問題。
3.在問題一中過程2.drop1.selectedValue = request.form["drp1"]。說明客戶端選中的值是不通過viewstate傳遞的,而是通過表單

Request.Form["drop1"].ToString()可以獲取的到的。凡是繼承了IPostBackDataHandler都是通過表單獲取客戶端提交的值的。所以不管是否

禁用viewstate都能獲取到客戶端提交的值.)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章