C# asp.net按钮需要启动两次

C# asp.net按钮需要启动两次,c#,asp.net,init,C#,Asp.net,Init,我正在生成动态html控件。在用户按下按钮导致回发后,控件将在Init上生成。但是,他需要按两次按钮才能生成控件。我怎样才能解决这个问题?代码: protected override void OnInit(EventArgs e) { if (Page.IsPostBack) { if (Session["id"] != null) { string id= Session

我正在生成动态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;
    }

会话[“id”]
在页面加载时设置为空。单击按钮后将页面发回时,首先调用
OnInit
方法,它将
Session[“id”]
的值作为
null
。之后,将执行按钮单击事件,并设置
会话[“id”]
。因此,当您第二次单击按钮时,
OnInit
对于
Session[“id”]
的值不是
null
,您的代码将在第二次单击时执行。

Session[“id”]
在页面加载时设置为null。单击按钮后将页面发回时,首先调用
OnInit
方法,它将
Session[“id”]
的值作为
null
。之后,将执行按钮单击事件,并设置
会话[“id”]
。因此,当您第二次单击按钮时,
OnInit
对于
Session[“id”]
的值不是
null
,并且您的代码在第二次单击时执行。

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

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

调用生成的动态控件(id);当按钮被点击时。这样,您将在第一次单击时拥有控件。当页面重新加载时,它们将在OnInit中重新创建

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

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

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);
}

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

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);
}
试试这个

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

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


只有在显式回发的情况下才创建控件。停止告诉它等待回发,它将停止等待回发。。有什么困惑吗?@KierenJohnstone我需要在按钮回发后创建控件,但它需要两次回发才能工作。在OnInit中设置一个断点,看看为什么不调用代码?只有在显式回发的情况下才能创建控件。停止告诉它等待回发,它将停止等待回发。。有什么困惑?@KierenJohnstone我需要在按钮回发后创建控件,但它需要两次回发才能工作。在OnInit中设置一个断点,看看为什么不调用代码?
OnInit
PageLoad
之前被调用,因此它在它变为null之前获取会话变量。是的,但是,第一次单击按钮时,
会话[“id”]
不会在
OnInit
之前设置,因为
button1u-click
不会在
OnInit
之前调用。对。那么,我如何修复它呢?如果将
OnInit
会话[“id”设置为按钮单击后端事件,则不能使用
。如果您的逻辑允许,您可以在方法
OnInit
本身中设置它。
OnInit
PageLoad
之前被调用,因此它会在它变为null之前获取会话变量。是的,但是在第一次单击按钮
Session[“id”]
OnInit
之前未设置,因为
按钮1\u Click
OnInit
之前未调用。对。那么,我如何修复它?如果要将
会话[“id”]
与按钮单击返回结束事件一起设置,则不能使用
OnInit
。如果逻辑允许,您可以在方法
OnInit
本身中设置它。问题是,我将控件生成为字符串,然后将它们附加到div中,例如:
div1.InnerHtml+=html。这样它们将被追加两次?为什么不将它们作为子控件添加?不管怎样,只要控件已经生成,你就可以在其中设置一个标志来检查,这样就不会第二次生成它们。这是一个非常复杂的情况,但主要原因是我不想让它们在服务器上运行,因为我稍后会用ajax请求来操作它们,ETC问题是我将控件生成为字符串,然后将它们附加到div中,例如:
div1.InnerHtml+=html。这样它们将被追加两次?为什么不将它们作为子控件添加?不管怎样,只要控件已经生成,你就可以在其中设置一个标志来检查,这样就不会第二次生成它们。这是一个非常复杂的情况,但主要原因是我不想让它们在服务器上运行,因为我稍后会用ajax请求来操作它们,etc@Knagis这似乎很管用,但是如果((this.ViewState[“DynamicControlGeneration”]=null)| |(this.ViewState[“DynamicControlGeneration”].ToString()!=id))我可以添加条件
在生成控件以避免重复之前?最好的解决方案不是禁用按钮吗?他可以在文本框上写入另一个Id并生成其他控件。在我非常复杂的情况下实现,效果非常好。thanks@Knagis这似乎工作正常,但我是否可以添加条件
if((This.ViewState[“DynamicControlGeneration”]=null)| |(This.ViewState[“DynamicControlGeneration”].ToString()!=id))
在生成控件以避免重复之前?最好的解决方案不是禁用按钮吗?他可以在文本框上写入另一个Id并生成其他控件。在我非常复杂的情况下实现,效果非常好。谢谢