【问题标题】:why does my asp.net control contain the previous value?为什么我的 asp.net 控件包含以前的值?
【发布时间】:2015-08-11 20:13:42
【问题描述】:

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

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

【问题讨论】:

  • 谁给draw_site_select打电话,更重要的是,什么时候打电话?
  • 对不起,“作为一种解决方法,我向 RadioButtonList 添加了一个事件处理程序”可能不够清楚......我的意思是我在“rbl_site”的创建中添加了一行代码rbl.SelectedIndexChanged += rb_CheckedChanged;

标签: c# asp.net postback autopostback


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这是因为在您的 page_load 事件中您没有考虑回发,而您的单选按钮列表值在回发中出现了变化。删除page_load事件中的if (!IsPostBack)条件检查并查看

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-06
      • 2019-03-27
      • 2017-09-26
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多