2012-03-30 3 views
1

Ich habe ein Bild und eine Schaltfläche. Ich habe eine Methode, die ein Bild zufällig aus einer Reihe von Bildern erzeugt. Aus irgendeinem Grund, während ich auf die Schaltfläche klicke, abgesehen von dem Ereignis, tritt es auch wieder in die Methode 'chooseImage' des Bildes ein und erzeugt eine weitere ID.Beim Klicken zuerst die Methode eingeben und dann auf eine andere Seite gehen

Hier unten finden Sie die Asp des Bildes und des Bildes Button;

<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" /> 

Unten ich hier gepostet auch die Event-Handler der Schaltfläche, wo der childID in einer globalen Variablen aus der ‚chooseImge‘ Methode und gespeichert wird erstellt.

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

Irgendwelche Vorschläge warum oder wie kann ich es tun? Grundsätzlich möchte ich als Session die ID des auf der Lade-Seite angezeigten Bildes weitergeben.

Hier finden Sie die Methode. Grundsätzlich lese ich zuerst aus der Datenbank eine Reihe von Datensätzen. Dann speichere ich die ID in einem Array, und indem ich eine Zufallsgeneratormethode aufruft, wird sie zufällig eine ID aus dem Array auswählen.

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

Sie sollten auch angeben, wo/wann die Methode aufgerufen wird, die die Image-ID generiert. –

+0

Das Bild wird beim Laden der Seite in einer Methode namens chooseImage generiert. –

+0

grundsätzlich habe ich eine globale Variable gemacht; 'int childId' und es sollte das Ergebnis der Methode speichern. Aber ich weiß nicht warum, wenn ich auf den Button klicke, ist es bei dieser Methode wieder entring und erzeugt eine weitere ID. –

Antwort

1

in der Page_Load prüfen, ob IsPostBack:

if(!this.IsPostBack) 
    chooseImage(); 

Dann können Sie Ihre ImageID auf Session oder Viewstate speichern. Oder Sie können eine verborgene TextBox verwenden, um die ID zu speichern und sie mit Request ["hiddenTextBoxId"] abzurufen;

Auf ASPX Seite versucht ein TextBox Versteckt hinzufügen:

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

In chooseImage Methode setzte die ID in TxtID

txtId.Text = yourid; 

Und vor dem Response.Redirect die ID aus der Textbox erhalten:

id = txtId.Text; 
+0

Ich würde lieber die Sitzung oder die Viewstate anstelle von versteckten Feldern verwenden. Sie müssen sich nicht um zusätzliche Felder in Ihrem Formularentwurf kümmern. Es ist einfacher zu pflegen. Und versteckte Felder können Sicherheitsprobleme mit sich bringen. (Ich sage nicht, das ist hier der Fall) – ThdK

2

Wenn Sie auf diese Schaltfläche klicken, wird ein Postback Aktion zuerst vor dem Onclick ausgelöst werden. Wenn Sie Code in der onload Methode, die nur einmal ausgeführt können, dann müssen Sie es mit Page.IsPostBack einzuwickeln wie hier:

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

Sie Session verwenden können, um den Wert des childID

Session("id") = childId; 
zu sparen

Und dann können Sie verwenden:

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

Ich habe das jetzt gemacht, aber jetzt, was ich bekomme ist, dass onclcick die ID ist 0 die ganze Zeit. –

+0

Können Sie Ihre Frage mit dem chooseImage-Code bearbeiten? – ThdK

1

Rufen Sie die Methode, die nur die Bild-ID erzeugt, wenn es nicht ein Postback ist. Speichern Sie die ID in ViewState, wenn sie nicht Teil des Postbacks ist.

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