0

我正在生成动态 html 控件。在用户通过按下按钮导致回发之后,控件正在 Init 上生成。但是,他需要按两次才能生成控件。我怎样才能解决这个问题?代码:

 protected override void OnInit(EventArgs e)
    {
        if (Page.IsPostBack)
        {
            if (Session["id"] != null)
            {
                string id= Session["id"].ToString();
                GenerateDynamicControls(id);

            }
        }
    }

 protected void Page_Load(object sender, EventArgs e)
    {
        Session["id"] = null;
    }

protected void Button1_Click(object sender, EventArgs e)
    {
        string id = TextBox1.Text;
        Session["id"] = id;
    }
4

4 回答 4

1

Session["id"]在页面加载时设置为 null。单击按钮后返回页面时,OnInit首先调用该方法并获取Session["id"]as的值null。之后执行并Session["id"]设置按钮单击事件。因此,当您第二次单击该按钮时,该按钮具有除 forOnInit以外的值,并且您的代码将在第二次单击时执行。nullSession["id"]

于 2013-03-19T10:27:15.477 回答
1

调用 GenerateDynamicControls(id); 单击按钮时。这样,您将在第一次单击时进行控制。当页面重新加载时,它们将在 OnInit 中重新创建。

protected void Button1_Click(object sender, EventArgs e)
{
    string id = TextBox1.Text;
    Session["id"] = id;
    GenerateDynamicControls(id);
}
于 2013-03-19T10:29:37.113 回答
1

不需要为这些目的使用会话。另外,您的代码在后续回发后可能会失败。

protected override void LoadViewState(object state)
{
    base.LoadViewState(state);
    var id = this.ViewState["DynamicControlGeneration"] as string;
    if (id != null)
        GenerateDynamicControls(id);
}

protected void Button1_Click(object sender, EventArgs e)
{
    string id = TextBox1.Text;
    this.ViewState["DynamicControlGeneration"] = id;
    GenerateDynamicControls(id);
}
于 2013-03-19T10:32:48.607 回答
1

试试这个,

protected override void OnInit(EventArgs e)
{
     if (Page.IsPostBack)
     {
         string id = Request.Form[TextBox1.ClientID].ToString();
         GenerateDynamicControls(id);
     }
}
于 2013-03-19T10:47:57.320 回答