Gå til innhold

Sende Variabler igjennom imagebutton


Anbefalte innlegg

Hei

 

Prøver å lage et "mine favoritter" script. Men er vant til PHP så jeg er ikke helt stødig.

 

Det jeg vil er å ha en knapp som heter "legg til i mine favoritter" som jeg skriver ut sammen med hver post ut ifra f.eks en katalog.

 

Når jeg trykker på denne knappen legges ItemID sammen med UserID i en ny tabell.

Bruker Repeater og VB.NET

 

 

asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">

<ItemTemplate>

//Imagebutton-----------------------------

<asp:Label ID="_lbl_" runat="server" Text='<%#Eval("ItemID")%>'></asp:Label>

<asp:Repeater ID="_rep_catalog" runat="server">

</asp:Repeater>

</ItemTemplate>

</asp:Repeater>

 

Hvordan blir VB.net koden for dette? jeg har lest og lest men finner ikke ut av dette.

 

Vil ha det inn i en INSERT spørring med variablene USERID og ITEMID.

Lenke til kommentar
Videoannonse
Annonse

<asp:ImageButton runat="server" id="minID" commandname="Trykk" CommandArgument='<%#Eval("EnDatabaseID")%>' OnCommand="minID_Command" />

 

private void MinCommand(object sender, CommandEventArgs e)

{

if( e.Name == "Trykk" )

{

string ID = e.Argument;

// gjør noe med ID.

}

}

 

 

Sikkert ikke helt riktig syntax... men du forstår sikkert.

 

Et lite tips er å putte <asp:imagebutton> utenfor repeateren først for å kunne legge til event'n ved hjelp av VS.Net på vanlig måte... Hvis den ligger inne i repeateren må du faktisk skrive kode for å få OnCommand til å fungere.

Lenke til kommentar

Har skrevet litt kode som jeg fikk tips om et annet sted som skulle fungere på samme måte:

 

<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource1">

<ItemTemplate>

<asp:Label ID="ItemID" runat="server" Text=<%#Eval("ItemID")%> Visible="false"> </asp:Label>

<asp:ImageButton id=Button1 ImageUrl="images/knapp.jpg" BorderWidth="0px" onclick="ImageButton1_OnClick" runat="server"/>

</ItemTemplate>

</asp:Repeater>

 

Altså bruke en label inne i hvert recordset. Funker det å gjøre det sånn?

 

Sub ImageButton1_OnClick(ByVal sender As Object, ByVal e As ImageClickEventArgs)

//Det er inne her jeg ikke skjønner hva jeg skal gjøre.

//Hvordan får jeg kjørt spørringen?

End Sub

 

Bruker DotNetNuke.

Lenke til kommentar

Bruk heller Command... Se eksempelet jeg skrev. Dette er mye mer "riktig".

 

Hvis du absolutt skal bruke onClick så blir vel koden noe sånt som dette:

 

Sub ImageButton1_OnClick(ByVal sender As Object, ByVal e As ImageClickEventArgs)

dim img as ImageButton = ctype(sender, ImageButton)

dim l as label = ctype(img.Parent.FindControl("ItemID"), label)

dim ID as integer = integer.parse( l.Text )

' gjør DB kall her...

end sub

 

+/- litt syntaxfeil...

Lenke til kommentar
ok, da bruker jeg Command metoden isteden. Men det med å legge imagebutton utenfor repeateren, skal jeg legge den der med visible="false" og uten <%Eval%> komandoen?

 

Får vel bare feilmelding om jeg prøver å legge den uten for uten no datasource.

6999177[/snapback]

 

Neida, man legger den bare utenfor midlertidig. For å få satt OnCommand event'n på den. Legg også til <%#Eval()%> saken etter at du har satt den tilbake i repeateren igjen.

 

:)

Lenke til kommentar

Takk for all hjelp Jørn! :)

 

Sliter fortsatt, må få kjøpt meg en bok :no:

 

Får ikke lov å ha asp:imagebutton inne i repeatern. får bare en feilmelding:

 

Literal content ('" OnCommand="minID_Command" Width="22px" /> </ItemTemplate> </asp:Repeater>') is not allowed within a 'System.Web.UI.WebControls.ImageButton'.

 

VB.net:

Protected Sub minID_Click(ByVal sender As Object, ByVal e As CommandEventArgs)

 

End Sub

 

Har nok helt sikkert gått glipp av noe. Vet ikke om en side har noen eksempler på dette?

Lenke til kommentar

Var bare en skrive feil som lagde kvalm.

Har kommet et stykke lengre nå:

 

Protected Sub minID_Command(ByVal sender As Object, ByVal e As CommandEventArgs)

 

If e.CommandName.Contains("Trykk") Then

 

Dim ItemID = e.CommandArgument

Dim ID = UserId

//sql

End If

 

 

End Sub

 

Har har jeg ihvertfall variablene jeg trenger. tror jeg.

 

Men går det da ann og bare slenge inn en spørring som legger dette direkte inn i databasen i samme metode?

Lenke til kommentar

Regna med at det var en liten skrivefeil der ja :) Ser jo ut som du er klar til å kjøre databasekallet nå fra samme metode.

 

Men jeg ville tatt med "as String": ;)

           If String.Compare(e.CommandName,"Trykk",True) = 0 Then
               Dim ItemID as String = e.CommandArgument
               Dim ID as String = UserId
               //kjør sql kall her...
           End If

Lenke til kommentar

Takk for hjelpen :)

 

En liten siste ting jeg lurer på:

 

If String.Compare(e.CommandName, "Trykk", True) = 0 Then

Dim ItemID As String = e.CommandArgument

Dim ID As String = UserId

 

Dim SQL As String = "INSERT INTO minefavoritter (UserID,ItemID) VALUES (" & UserId & "," & ItemID & ")"

Dim connection As New SqlConnection(SiteSqlServer)

Dim command As New SqlCommand(SQL, connection)

connection.Open()

 

End If

 

Har SQL connection string i web.config, hvordan får jeg brukt denne her?

(SiteSqlServer) heter den.

 

Ellers er det riktig satt opp?

Lenke til kommentar

Endelig gikk det!

 

Tusen takk for hjelpen!!

 

Sånn ble det:

 

Protected Sub minID_Command(ByVal sender As Object, ByVal e As CommandEventArgs)

 

If String.Compare(e.CommandName, "Trykk", True) = 0 Then

Dim ItemID As String = e.CommandArgument

Dim ID As String = UserId

Dim conn As SqlConnection

Dim comm As SqlCommand

 

Dim strConnString As String = ConfigurationManager.ConnectionStrings("SiteSqlServer").ConnectionString

conn = New SqlConnection(strConnString)

comm = New SqlCommand("INSERT INTO MineFavoritter (UserID,ItemID) VALUES (" & UserId & "," & ItemID & ")", conn)

 

conn.Open()

comm.ExecuteNonQuery()

conn.Close()

End If

End Sub

Lenke til kommentar

Et par små tips:

* Bruk ALLTID Using når du bruker SqlConnection. ("alltid" for viderekommende ;) )

* ID brukte du ikke. I tillegg ser det for meg ut som begge de to er INT i databasen. Derfor forandret jeg dem til Integer.

* E.CommandArgument = string, så der brukte jeg Integer.Parse for å konvertere til Integer + (viktig) for å unngå sql injection attack. Jeg "regnet med" at Userid variabelen også var string. Hvis den allerede er Integer trenger du ikke gjøre dette her (eller for den sags skyld lage en ny variabel 'ID').

* Kortet ned koden litt ved å gjøre "Dim" og "New" på samme linje

 

 

Protected Sub minID_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
   If String.Compare(e.CommandName, "Trykk", True) = 0 Then
       Dim ItemID As Integer = Integer.Parse(e.CommandArgument)
       Dim ID As Integer = Integer.Parse(UserId)
       Using conn As new SqlConnection( ConfigurationManager.ConnectionStrings("SiteSqlServer").ConnectionString )
        Dim cmd As New SqlCommand("INSERT INTO MineFavoritter (UserID,ItemID) VALUES (" & ID & "," & ItemID & ")", conn)
        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()
End Using
   End If
End Sub

Lenke til kommentar

På detta har jeg jo lagt alt i samme fil. Men har lagt merke til at DotNetNuke portalen bruker de sånn Data access layer. Der de har forskjellige kontrollere som tar seg av forskjellige ting når det skal skrivers til DB.

 

f.eks

GUI:

<asp:ObjectDataSource>

Som kaller på en metode i en kontroller som igjen kaller på en info fil som inneholder alle variabler. DAL+ kalte de det.

Syns det blir masse kode av å gjøre det slik og tungvint.

Men hvorfor gjør de slik? sikkerhet?

 

Det du viste meg her er det like sikkert?

Lenke til kommentar
På detta har jeg jo lagt alt i samme fil. Men har lagt merke til at DotNetNuke portalen bruker de sånn Data access layer. Der de har forskjellige kontrollere som tar seg av forskjellige ting når det skal skrivers til DB.

 

f.eks

GUI:

<asp:ObjectDataSource>

Som kaller på en metode i en kontroller som igjen kaller på en info fil som inneholder alle variabler. DAL+ kalte de det.

Syns det blir masse kode av å gjøre det slik og tungvint.

Men hvorfor gjør de slik? sikkerhet?

 

Det du viste meg her er det like sikkert?

7053324[/snapback]

 

Den koden som jeg skrev over er like sikker. Problemet er at det er vanskeligere å "huske på" å skrive sikker kode. DAL (Data Access Layer) er som regel et ekstra abstraksjonsnivå slik at man ikke "trenger å tenke på" dette. I tillegg er det et ekstra nivå for sikkerhet fordi ting blir sjekket både i lag1(presentasjon) og i lag2(DAL).

 

En annen grunn er at DAL kan legges i eget prosjekt (DLL) og brukes av flere typer klienter som bruker samme database. F.eks. windows app, webservice, webside, etc...

 

Avhengig av type prosjekt og størrelse hender det også at jeg gjør noe lignende. Uansett syntes jeg det er veldig tungvindt å bruke SqlConnection-klassene direkte og har alltid en wrapper rundt dem.

 

Eks på kode som jeg bruker isteden med en egen Query klasse jeg har lagd:

 

// Query henter automatisk connectionstring fra web.config.
// using sikrer at alle connections blir lukket.
using( Query q = Query.ExecuteReader("SELECT UserID, Email FROM Users") )
{
  while( q.Read() )
  {
      Users.Add( new User( (int)q["UserID"], (string)q["Email"] ) );
  }
}

private bool DeleteUser(int userID)
{
  return 1 == Query.ExecuteNonQuery("DELETE Users WHERE UserID = " + userID.ToString());
}

edit: oopps, det ble plutselig C# ;)

 

eks. på hvordan koden din ville blitt skrevet med en sånn "wrapper":

 

Protected Sub minID_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
  If String.Compare(e.CommandName, "Trykk", True) <> 0 Then Return

  Dim ItemID As Integer = Integer.Parse(e.CommandArgument)
  Dim ID As Integer = Integer.Parse(UserId)
  Query.ExecuteNonQuery("INSERT INTO MineFavoritter (UserID,ItemID) VALUES (" & ID & "," & ItemID & ")")
End Sub

Endret av jorn79
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...