Monday, November 5, 2007

__doPostBack e argomenti

. Monday, November 5, 2007

Se in Asp.Net si deve simulare un postback ci sono diverse strade più o meno eleganti.
Supponiamo di avere un controllo input di tipo button, sul cui evento onclick dobbiamo eseguire prima una funzione di validazione lato client(validation) e solo in caso affermativo eseguire un postback:

btnValidation.Attributes.Add( "onclick", "if(validation())"
+ Page.GetPostBackClientEvent( btnValidation, "submit"));

In Asp.Net 1.1, è possbile usare GetPostBackClientEvent, metodo esposto dalla classe Page, che permette di avere sempre un corretto riferimento al controllo di cui si vuole simulare il postback sul server.
In Asp.Net 2.0 il metodo in questione è targato come obsoleto, a tal riguardo vi rimando al metodo ClientScriptManager.
La funzione GetPostBackClientEvent invoca GetPostBackEventReference che restituisce il prototipo della funzione javascript che se invocata causa un postback.
Accetta due parametri: l'id del controllo ed un argomento e restituisce una stringa simile a questa:
__doPostBack('idPostBack', 'submit')
Lato server è possibile anche recuperare l'argomento passato, nel seguente modo:

if( Request["__EVENTARGUMENT"] == "submit")
{
}

La stessa operazione si può anche effettuare lato markup:

<INPUT id="btnValidation" runat="server" type="button" value="Button" runat="server"
onclick
='if( validation())<%GetPostBackClientEvent(btnValidation,"submit")%>'>

Volendo, in modo molto meno elegante si può risolvere eseguendo sul form un submit:

<INPUT id="btnValidation" onclick="if( validation()){
document.forms[0].myHiddenField.value='submit';
document.forms[0].submit();}"
type="button" value="Button">

Dopo aver eseguito la funzione validation valorizzo un campo hidden myHiddenField, ed eseguo il submit del form.
Lato server verifico se il campo hidden, necessario per capire chi ha scatenato il submit, è stato valorizzato:

if( Request.Form[ "myHiddenField"] != string.Empty &&
Request.Form[
"myHiddenField"] == "submit")
{
//Richiamo il mio metodo
}

0 commenti:

Post a Comment