#########
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