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

时间:2015-08-11 20:13:42

标签: c# asp.net postback autopostback

我有一个动态创建的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);
        }
    } 

但这一切都感觉像是一种解决方法。有人可以解释这里发生了什么,以及我可能应该如何处理这个问题?

2 个答案:

答案 0 :(得分:1)

每次请求进入服务器时,都会运行页面生命周期事件。其中一个步骤是读取视图状态数据并使用视图状态数据重新初始化控件。由于http是无状态的,这就是asp.net保持状态的方式。由于您动态创建控件,因此它们的值不会添加到视图状态,因此下次发出请求时,您为动态创建的控件设置的值将丢失。您应该在Page的 Init 事件中创建动态控件,以便它们被视图状态捕获。

答案 1 :(得分:0)

page_load事件中的原因是您没有考虑回发,而您的radiobuttonlist值更改存在于回发中。删除if (!IsPostBack)事件中的page_load条件检查,然后查看

    protected void Page_Load(object sender, EventArgs e)
    {
      Response.Write(((RadioButtonList)Panel1.FindControl("rbl_site")).SelectedValue);
    }