为什么我的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);
        }
    } 

但这感觉有点像变通。有人能解释一下这里发生了什么,我应该如何解决这个问题吗?

为什么我的asp.net控件包含以前的值

每次请求发送到服务器时,都会运行页面生命周期事件。其中一个步骤是读取视图状态数据,并用视图状态数据重新初始化控件。由于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);
    }