<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都能獲取到客戶端提交的值.)