15 messaggi dal 14 luglio 2010
Buongiorno, ho ha webForm in cui sono presenti, tra gli altri, 2 controlli textbox e una label: se i primi due sono stati riempiti, il testo della label dovrebbe immediatamente mostrare il suo contenuto ("1") ed essere usato per effettuare un calcolo senza che ci sia un postBack della pagina. Come mi conviene procedere in questo caso? Grazie
103 messaggi dal 04 ottobre 2010
Ciao Barbara, la risoluzione del tuo problema può avvenire soltanto inserendo funzioni client script nella tua pagina. Se non vuoi il Postback, vuol dire che quella pagina non deve essere ricalcolata tramite il server... ma senza uno script client per fare anche la più piccola modifica alla pagina, è necessario che ci sia il PostBack.
Se vuoi procedere con lo scripting client (come javascript), tieni presente che la logica di programmazione che metti nello script, è disponibile al client, a differenza di quella server, quindi chiunque la può leggere. Insomma, per esempio, non puoi mettere controlli per la password che funzionino esclusivamente tramite scripting client.
In poche parole, se "ti puoi permettere" di poter far vedere in chiaro le tue funzioni in script senza che ne vada a discapito la sicurezza, puoi usare semplicemente lo script client, altrimenti per fare ciò che tu richiedi hai bisogno di un altro compromesso. Il compromesso si chiama Ajax: ovvero lo scripting client che risiede nella pagina al momento in cui ne richiami le funzioni, interroga il server inviandone le informazioni ad un'altra pagina (o meglio ancora, ad un handler) e ne aspetta la risposta. Quando il server risponde, dopo essersi fatto i suoi calcoli lato server ovviamente(nel caso usi una pagina, questa pagina esterna andrà in postback ma in quella che il client vede tutto ciò è completamente invisibile), lo script deve interpretare la "parte testuale" della risposta e modificare il label a seconda di essa.
Ho cercato di riassumerti qualche anno di tecnologie web in poche righe, spero di essere stato chiaro  .
Per scripting client ti consiglio di usare javascript.
Modificato da Biohazard il 21 agosto 2012 12.52 -
Modificato da Biohazard il 21 agosto 2012 12.53 -
15 messaggi dal 14 luglio 2010
Ti ringrazio infinitamente per il riassunto di anni e anni di esperienza... quelli che mancano a me. Ma e' solo questione di tempo e applicazione, no?
Tornando alla questione, posso serenamente usare un javascript che posso recuperare tramite san Google ma sono confusa sul modo corretto di utilizzarlo: e' sufficiente scriverlo sulla pagina aspx e poi richiamarlo sull'evento TextChanged di entrambe le textbox? Oppure devo fare altro? Sarebbe utile un esempio for dummies
103 messaggi dal 04 ottobre 2010
Allora, dovresti dividere il concetto di programmazione Client da quella server. L'unico ponte che li unisce sono le richieste (infatti Ajax è un tipo di richiesta, di nome XHR).
Un controllo TextBox, per farti un esempio di suddivisione, in asp.net viene dichiarato con il tag <asp:TextBox runat="server" ecc ecc...></asp:TextBox>

Penso sia chiaro il fatto che se tu generi un HTML mettendo dentro questo tag, aprendolo con il browser non si potrà avere lo stesso risultato che si ha quando vedi una pagina generata da ASP.NET, ma potrebbe vedere quel tag come semplice testo.
Perchè questo?
Praticamente, in parole povere, un controllo ASP.NET ha un meccanismo di trasformazione che ti fa diventare quell'<asp:TextBox ecc ecc..> in un <input type="text" ecc ecc...> . Questo meccanismo prende il nome di Renderizzazione.
Infatti, se tu su di un html ci metti all'interno quest'ultimo tag, l'input, potrai vederlo all'interno della pagina simile al TextBox asp. Se cambia un po' è per via degli stili che ASP mette di default, ma non è importante a livello di funzionalità. Comunque, il javascript lavora sull'input, indipendentemente dal fatto che prima era un TextBox asp, o altro.
Però, non avendo un TextBox nel lato client javascript, non hai nemmeno i suoi eventi... nè le sue proprietà.
Può giustamente sorgere la domanda "Ma allora come fa a funzionare il TextChange sul server?". Una risposta (sempre approssimata) si trova ovviamente sempre nel motore asp.net: quando avviene il postback, asp.net (a patto che non venga modificata la proprietà "name" del controllo e che troverai nell'HTML, generata da asp.net stesso) sa benissimo che quell'input era la sua textbox, vede com'è stato modificato dal client che gli ha immesso un valore, lo trova diverso, e di conseguenza lancia l'evento.
Il PostBack è necessario però perché è un evento riguardante un controllo lato server, e quindi usare un evento di un controllo lato server, non ti interessa, poiché volevi evitare proprio il PostBack.
La proprietà name è importante anche nel javascript comunque: tramite quella puoi ottenere l'elemento e trattarlo come un oggetto.
Qui http://www.w3schools.com/tags/tag_input.asp troverai tutte le proprietà e gli eventi di un elemento input trattabili con javascript in maniera nativa. Come vedi hai keyup keydown e keypress, eventi propri che solitamente servono anche per controllare il cambiamento di valore dell'input ed intervenire "in tempo reale" senza l'esigenza di postback o altro. Ma devi gestirli in javascript. Il tag <script type="text/javascript"> ... </script> è inseribile nella pagina aspx, e può contenere il javascript necessario per gestire quegli eventi. Come trovo un esempio valido, ti mostrerò come si può utilizzare... intanto, è probabile che se cerchi in giro e ti alleni ci riesci lo stesso
PS: per analizzare gli elementi della pagina html sono disponibili potenti tools come Firebug per Mozilla, o nativamente, i programming tools di chrome che hai a disposizione premendo il tasto f12 (anche Firebug si attiva con f12 una volta installato).
PPS: il name di un input è generato da ASP.NET e solitamente rispecchia l'ID che dai al controllo, ma a volte potrebbe essere un qualcosa di poco leggibile e tremendamente intrattabile, in caso ti dirò come ovviare a questo problema
Modificato da Biohazard il 21 agosto 2012 17.01 -
15 messaggi dal 14 luglio 2010
Arigrazie per la spiegazione e la disponibilita'
Diciamo che nella pagina aspx scrivo:
 <script type="text/javascript">
     function calcolaPresenze() {
 if((document.getElementById('<%=txtNome1.ClientID%>').value!="")&&(document.getElementById('<%=txtCognome2.ClientID%>').value!="")) {
     document.getElementById('<%=lblCount.ClientID%>').value == "Filled!"}
}
</script>


basta aggiungere un CustomValidator per ognuna delle due textbox?
<asp:CustomValidator ID="cv1" runat="server" ControlToValidate="txtNome1" ClientValidationFunction="calcolaPresenze()" EnableClientScript="True"></asp:CustomValidator>


Sto dimenticando qualcosa, vero?

AGGIORNAMENTO: si, sto dimenticando o sbagliando qualcosa... provo a lasciar perdere il validatore e tento con onblur sulla texbox...
Modificato da Barbara il 21 agosto 2012 18.06 -
Modificato da Barbara il 21 agosto 2012 19.09 -
103 messaggi dal 04 ottobre 2010
La funzione che hai scritto penso che dovrebbe essere rivista: a livello sintattico è errato.
Ti commento quello che succede
function calcolaPresenze() {
//Le condizioni a livello concettuale sono giuste
if((document.getElementById('<%=txtNome1.ClientID%>').value!="")&& ( document.getElementById('<%=txtCognome2.ClientID%>').value!=""))
{
//questa è un'uguaglianza, restituisce un Booleano, non è un //assegnazione
document.getElementById('<%=lblCount.ClientID%>').value =="Filled!";
}
}
Il commento sulle condizioni indica che a livello concettuale ci siamo, ma potrebbe non bastare. Forse il mio è soltanto un formalismo, ma in assenza di valore sarebbe bene controllare che quel Value dell'input non solo sia diverso da una stringa vuota, ma che sia diverso anche da null e undefined. Per salvarti gli elementi usa pure i seguenti statement:
var nome=document.getElementById('<%=txtNome1.ClientID%>');
var cognome=document.getElementById('<%=txtCognome2.ClientID%>');
Così puoi rendere la sintassi del tuo script più leggibile, soprattutto nel caso in cui vuoi gestire il nullvalue:
if(((nome!="")&&(nome!==null)&&(nome!==undefined))&&(cognome!="").....)

La disuguaglianza !== trova la sua negazione nell'uguaglianza === e se sei nuova di javascript, è importante conoscerla. E' l'uguaglianza stretta e differisce da quella "normale" == perché è un'uguaglianza che guarda il tipo, oltre che il valore. Se in javascript scrivessi 3=="3" risponderebbe con true, mentre con 3==="3" la risposta sarebbe false.
Ora, il label non essendo un elemento interattivo come l'input, non ha la proprietà value. Puoi tuttavia modificarne il testo tramite il suo attributo InnerHTML come puoi vedere dal seguente link:
http://http://forums.asp.net/t/1313311.aspx

Adesso, ti manca soltanto la chiamata javascript a questa funzione. Se il tag script è definito DOPO gli input, allora è possibile fare la chiamata al getElementById direttamente fuori dalla funzione, il che però comporta la globalizzazione delle variabili nome e cognome (assicurati che non ce ne siano altre globali con lo stesso nome oppure si può generare del conflitto). Perché però il tag script dovrebbe stare dopo? Il fatto è che javascript è un linguaggio dichiarativo, quindi le variabili o gli elementi che usi, devono essere dichiarati PRIMA nel documento, al momento dell'utilizzo. Nella funzione non c'era problema di verificare se fossero già dichiarate o meno, poiché se la sua chiamata avveniva DOPO la creazione di tali elementi anche se stava dichiarata PRIMA non c'erano problemi.
Un esempio può valere più di mille parole:

<script type="text/javascript>
function getEl(id)
{
return document.getElementById(id)
}
</script>
......
<input type="text" id="prova"></input>
......
<script type="text/javascript">
var test=getEl("prova");
</script>

Questo codice è giusto. Nel caso in cui però il secondo script venisse dichiarato prima dell'input in questione, la funzione non avrebbe trovato nessun elemento ed avrebbe restituito null o undefined.
L'ultima tappa ora sarebbe quella di decidere quando chiamare la tua funzione.
Abbiamo quindi
<script type="text/javascript">
var nome=document.getElementById('<%=txtNome1.ClientID%>');
var cognome=document.getElementById('<%=txtCognome2.ClientID%>');
function ControllaPresenze()
{
if(((nome!=="")............))
.....
.....
}
//leghiamo la funzione al keyup degli input
nome.onkeyup=ControllaPresenze();
cognome.onkeyup=ControllaPresenze();
</script>
Puoi provare a legare in questa maniera la funzione agli eventi keyup di entrambi i campi, in modo da farla agire senza chiamare il server, e senza quindi avere un postback, invocandola ogni volta che un tasto premuto si solleva mentre scrivi sui campi. Spero sia quello che cerchi e che funzioni.
15 messaggi dal 14 luglio 2010
Buongiorno e ancora grazie. Ieri sera ho pensato che forse, forse, forse... era necessario togliere la polvere da quel libricino di Javascript che avevo comprato un millennio fa e mai aperto  Ad ogni modo, avrei potuto continuare a fare tentativi all'infinito se questa mattina non avessi scoperto che (non era difficile, bastava sbirciare nel sorgente e farsi venire il dubbio): dato che i miei controlli si trovano all'interno di un controllo Wizard a sua volta compreso in una Multiview, questo
document.getElementById('<%=txtNome1.ClientID%>')
non e' in grado di identificare il controllo una volta renderizzato... non riesco a farmene una ragione ma, chiamandolo cosi'
document.getElementById("wizard1_txtNome1")
funziona. Avevo omesso la questione credendo che document recuperasse comunque la textbox...
Sara' il caldo, sara' l'ignoranza ma... mi riservo di contraddirmi entro pochi minuti!!! Grazie
103 messaggi dal 04 ottobre 2010
Forse il controllo wizard che ancora non ho avuto il piacere di provare, non ti permette di accedere direttamente alla txtNome1, se è così avrebbe dovuto darti errore Asp.Net quando tentavi di richiamarlo.
Infatti credo sia un controllo templated, come un ListView o un Repeater, che hanno la caratteristica di poter ripetere gli ID dei controlli purchè questi stiano in template diversi.
Infatti, non è possibile poi retribuirli nel codebehind se non passando tramite il FindControl del template interessato (come parametro si passa l'ID in stringa).

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.