为什么我的asp.net控件包含以前的值
本文关键字:包含 控件 我的 asp net 为什么 | 更新日期: 2023-09-27 18:07:26
我有一个动态创建的RadioButtonList
我已经启用了AutoPostBack,因为我想在所选值发生变化时动态地创建一些更多的控件。
当我尝试检索Page_Load中选择的值时,它似乎返回先前选择的值而不是当前选择的值。
protected void Page_Load(object sender, EventArgs e)
{
draw_site_select();
if (!IsPostBack)
{
Response.Write(((RadioButtonList)Panel1.FindControl("rbl_site")).SelectedValue);
}
}
void draw_site_select()
{
using (Circles_DatabaseDataContext db = new Circles_DatabaseDataContext())
{
var sites = from r in db.circle_sites select r;
RadioButtonList rbl = new RadioButtonList();
rbl.ID = "rbl_site";
rbl.DataSource = sites;
rbl.DataValueField = "circle_site_id";
rbl.DataTextField = "circle_site_name";
rbl.DataBind();
rbl.RepeatDirection = RepeatDirection.Horizontal;
rbl.AutoPostBack = true;
Panel1.Controls.Add(rbl);
}
}
作为一个解决方案,我添加了一个事件处理程序到RadioButtonList
void rb_CheckedChanged(object sender, EventArgs e)
{
Response.Write(((RadioButtonList)sender).SelectedValue);
}
这可以工作,但是当另一个对象引起回发时,我必须处理值的检索。
我写了下面的代码;
protected void Page_Load(object sender, EventArgs e)
{
draw_site_select();
if (!IsPostBack && !Request.Params["__EVENTTARGET"].ToString().Contains("rbl_site"))
{
Response.Write(((RadioButtonList)Panel1.FindControl("rbl_site")).SelectedValue);
}
}
但这感觉有点像变通。有人能解释一下这里发生了什么,我应该如何解决这个问题吗?
每次请求发送到服务器时,都会运行页面生命周期事件。其中一个步骤是读取视图状态数据,并用视图状态数据重新初始化控件。由于http是无状态的,这就是asp.net保持状态的方式。由于您是动态创建控件的,因此它们的值不会添加到视图状态中,因此下次发出请求时,您为动态创建的控件设置的值将丢失。您应该在Page的Init事件中创建动态控件,以便它们被viewstate捕获。
这是因为在您的page_load
事件中您没有考虑回发,而您的单选按钮列表值在回发中存在变化。移除page_load
事件中的if (!IsPostBack)
条件检查,参见
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(((RadioButtonList)Panel1.FindControl("rbl_site")).SelectedValue);
}