[ASP.NET] Effettuare un __doPostBack per passare un valore personalizzato

#########
Modificato
Nei feedback trovate il commento di Andrea Boschin che spiega la soluzione "corretta" al problema. Lascio comunque il testo originale coi miei passaggi, che mi sono stati comunque utili per conoscere meglio il PostBack e per capire meglio il funzionamento di CommandName e CommandArgument suggeriti da Andrea.
#########

Ieri mi sono trovato nella condizione di dover eseguire una singola operazione al click effettuato su un semplice link (ma poteva essere qualsiasi altro controllo) contenuto in un DataList associato a dati di uno UserControl.

Non volevo perdere il ViewState degli altri UserControl e quindi anche della pagina stessa e la soluzione che (per ora) ho adottato è stata di fare un postback "manuale" sulla pagina passando un valore personalizzato.

Come si capisce credo si tratti di un argomento di livello sicuramente "beginner" su ASP.NET, ma purtoppo solo da poco tempo sto iniziando ad utilizzarlo "realmente" (ed infatti non vedo l'ora di fare il corso con Andrea per chiarirmi giusto qualche miliardata di dubbi ).

Ho provato a cercare qualcosa, visto che su UGIdotNET o comunque su Google qualcosa di sicuro c'è, ma dopo aver cercato invano (il problema è sempre trovare le giuste key di ricerca...) ho trovato il metodo alla vecchia maniera: curiosando nel codice!

Comunque a vostro "rischio e pericolo" (di leggere vaccate ) posto qualche riga nel caso qualcuno volesse riutilizzare o anche solo criticare questa procedura.

Nel caso qualcuno non lo sapesse ASP.NET analizza i due campi nascosti __EVENTTARGET ed __EVENTARGUMENT per capire chi ha generato il postback e che valore (facoltativo) ha passato.

La sntassi usata più o meno da .NET per "riconoscere" il controllo che ha richiesto il postback è:

MyLinkButton nel caso di un LinkButton, oppure

MyUserControl$MyLinkButton nel caso di un LinkButton contenuto in uno UserControl, oppure

MyParentUserControl$MyChildUserControl$MyLinkButton nel caso di un LinkButton contenuto in uno UserControl, a sua volta contenuto in un altro UserControl (si, si... le matrioske... )

In questo caso invece di trovarsi il suo nome "in codice" del controllo si troverà un "nostro" codice che ovviamente non saprà riconoscere. Sarà compito nostro andare a gestire quel postback.

In pratica il codice da includere nella pagina aspx (o ascx) sarà il seguente:

<a href='<%# String.Format("javascript:__doPostBack(""MyFunctionKey"",""{0}"")", Container.DataItem.ExampleID) %>'>Fa quì cos</a>

Mentre nel code behind dovremmo gestire il postback nell'evento Load del form:

If Me.IsPostBack Then
  
'Controllo se è il postback che ho generato io da quel controllo
  
If Request.Form("__EVENTTARGET") = "MyFunctionKey" Then
      Dim
myValue as String = Request.Form("__EVENTARGUMENT")
     
MyFunction(myValue)
  
End If
End
If

Print | posted @ mercoledì 6 aprile 2005 12.27

Comments on this entry:

Gravatar # re: Effettuare un __doPostBack per passare un valore personalizzato
by Andrea Boschin at 06/04/2005 14.11

Non so se ho capito male, ma credo che quello che hai fatto si potesse evitare anche perchè gestirsi in proprio __EVENTTARGET e __EVENTARGUMENT è davvero una worst practice. Penso che la soluzione corretta al tuo problema fosse di usare un linkbutton nella datalist ed usare le sue proprietà CommandName e CommandArgument per eventualmente passarti delle informazioni sul server. Inoltre per recuperare la chiave di una riga del datalist è opportuno usare DataKeyField in combinazione con DataKeys.

Infine, dovendo generare un postback manualmente, ASP.NET ti mette a disposizione degli strumenti adeguati. Prova a leggerti la documentazione in GetPostBackClientHyperlink() della classe Page.
  
Gravatar # re: [ASP.NET] Effettuare un __doPostBack per passare un valore personalizzato
by Mario Duzioni at 06/04/2005 18.23

Grazie Andrea, ho appena letto il tuo commento. Approfondisco il tutto ed eventualmente correggo quanto scritto sul post (per non lasciare informazioni scorrette in giro...).

Ciao, a domani...
  
Gravatar # re: [ASP.NET] Effettuare un __doPostBack per passare un valore personalizzato
by Mario Duzioni at 06/04/2005 20.19

Ok, credo di aver capito come funziona il tutto.

Come scrivevo, la procedura che avevo applicato "(per ora)" era sicuramente da "walk around"; adesso grazie alla tua nota la posso tranquillamente definire "sbagliata"!

Ribadisco anche che: "purtoppo solo da poco tempo sto iniziando ad utilizzarlo realmente"... Non è mai la stessa cosa fare progettini di prova e mettere in piedi soluzioni reali! SOB...

Meno male che il corso capita proprio adesso!

Grazie, ciao!
  
Gravatar # re: [ASP.NET] Effettuare un __doPostBack per passare un valore personalizzato
by Andrea Boschin at 07/04/2005 8.53

E' normale che chi lavora da poco in ap.net si trovi in queste situazioni. Mi sembrava corretto darti qualche indicazione in merito.
  
Comments have been closed on this topic.