asp.net Button需要被触发两次

时间:2013-03-19 10:19:24

标签: c# asp.net init

我正在生成动态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 个答案:

答案 0 :(得分:1)

页面加载时

Session["id"]设置为null。在点击按钮后回发页面时,首先调用OnInit方法,并将Session["id"]的值设为null。之后,执行按钮单击事件并设置Session["id"]。因此,当您第二次点击该按钮时,OnInit的{​​{1}}除null以外的值时,您的代码将在第二次点击时执行。

答案 1 :(得分:1)

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

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

答案 2 :(得分: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);
}

答案 3 :(得分:1)

试试这个,

protected override void OnInit(EventArgs e)
{
     if (Page.IsPostBack)
     {
         string id = Request.Form[TextBox1.ClientID].ToString();
         GenerateDynamicControls(id);
     }
}