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