单击首先输入方法,然后转到另一页

时间:2012-03-30 12:30:11

标签: c# asp.net

我有一个图像和一个按钮。我有一种方法可以从一组图像中随机生成图像。出于某种原因,当我单击按钮而不是执行该事件时,它也会再次进入Image的方法'chooseImage'并生成另一个id。

在这里,您可以找到图像的asp和图像按钮;

<asp:Image ID="Image1" runat="server" Height="300px" Width="200px" OnDataBinding="chooseImage" />


<asp:ImageButton ID="aboutBtn" src="Resources/Icons/HomeAboutMeBtn.png" OnClick="AboutBtn_Click" runat="server" />

下面我还发布了按钮的事件处理程序,其中childId是从'chooseImge'方法生成的,并存储在全局变量中。

protected void AboutBtn_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/ChildDescription.aspx?id=" + childId);
        }

有任何建议我为何或如何做?基本上我想作为会话传递加载页面上显示的图像的ID。

下面你可以找到方法。基本上我首先从数据库中读取一组记录。然后我将id存储在数组中,然后通过调用随机生成器方法,它将从数组中随机选择一个id。

protected void chooseImage(object sender, EventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(conString))
            {
                try
                {
                    connection.Open();

                    using (SqlCommand cmd = new SqlCommand("GetAllChildren", connection))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        using (SqlDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                array.Add(reader["Child_ID"].ToString());
                                counter++;
                            }

                      connection.Close();
                        }
                    }
                }
                catch (Exception) { }

                if (array.Count != 0)
                {
                    try
                    {
                        using (SqlCommand command = new SqlCommand("GetChildDetails", connection))
                        {
                            command.CommandType = CommandType.StoredProcedure;
                            childId = Convert.ToInt32(array[RandomNumber(1, counter - 1)]);
                            command.Parameters.Add("@ChildID", SqlDbType.Int).Value = childId;
                            connection.Open();

                            using (SqlDataReader reader = command.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    Image1.ImageUrl = "Resources/Children Images/" + reader["Primary_Image"].ToString();
                                    ChildName.Text = reader["Child_Name"].ToString();
                                    ChildName.Font.Size = 20;
                                    surname.Text = reader["Child_Surname"].ToString();
                                    surname.Font.Size = 20;
                                    place.Text = reader["Location"].ToString();
                                    place.Font.Size = 14;
                                    genderLabel.Text = reader["Gender"].ToString();
                                    genderLabel.Font.Size = 14;
                                    DateTime birthday = DateTime.Parse(reader["Birthday"].ToString());
                                    DateTime now = DateTime.Today;
                                    int age = now.Year - birthday.Year;

                                    if (birthday > now.AddYears(-age))
                                    {
                                        age--;
                                    }

                                    Years.Text = age.ToString() + "-years-old";
                                    Years.Font.Size = 14;
                                }

                             connection.Close();
                            }
                        }
                    }
                    catch (Exception) { }

                }
            }
        }

        private int RandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }

3 个答案:

答案 0 :(得分:2)

单击该按钮时,将在onclick之前首先触发PostBack操作。 如果onload方法中的代码只能运行一次,那么你需要用Page.IsPostBack将它包装起来,如下所示:

 if (!Page.IsPostBack) {
    chooseImage();
 }

您可以使用Session来保存childid的值

Session("id") = childId;

然后你可以使用:

protected void AboutBtn_Click(object sender, EventArgs e)
    {
        string id = (string) Session("id");
        Response.Redirect("~/ChildDescription.aspx?id=" + id);
    }

答案 1 :(得分:1)

只有在不是回发的情况下,才调用生成图像ID的方法。如果id不是回发的一部分,请将其保存在ViewState中。

  private void Page_Load()
  {
      if (!IsPostBack)
      {
          generateImageId();
      }
  }

答案 2 :(得分:1)

在Page_Load中检查是否IsPostBack:

if(!this.IsPostBack)
     chooseImage();

然后您可以在Session或ViewState上保存ImageID。或者您可以使用隐藏文本框来存储ID并使用Request [“hiddenTextBoxId”]检索它;

在ASPX页面上尝试添加隐藏的TextBox:

<asp:HiddenField ID="txtId" runat="server" />

在chooseImage方法中将id放在txtId

txtId.Text = yourid;

在Response.Redirect从文本框中获取id之前:

id = txtId.Text;