<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可以获取到client选中的值.这个时候又是为什么? 答:在在服务端通过在页面的标签里面进行赋值,事实上在请求到达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属性不是空的,当然就能够把client的返回值,赋给selectedValue了。 (另外一个大家须要知道的是, 1.服务端的.aspx页面进行初始化,viewtate是不会被记录的,所以我们查看client的viewtate事实上也是没有drop中所包括的信息的. 2.假设我们对下拉框的赋值是通过client进行的,也就是Js.那我们在回发的时候发现SelectedValue的值也是空的,事实上我们也能够通过问题1 能够来解释。client赋值这里就不涉及到一个装载和解析viewstate的问题。 3.在问题一中过程2.drop1.selectedValue = request.form["drp1"]。说明client选中的值是不通过viewstate传递的,而是通过表单 Request.Form["drop1"].ToString()能够获取的到的。凡是继承了IPostBackDataHandler都是通过表单获取client提交的值的。所以无论是否 禁用viewstate都能获取到client提交的值.)