113 messaggi dal 27 ottobre 2005
Salve,
ho creato un WebUserControl, da un semplice campo "TextBox" ed al suo interno, ho aggiunto delle funzioni javascript (lato client) per formattare/controllare il contenuto del campo stesso. Ho poi creato ed esposto una proprietà "TipoCampo". Volevo sapere se era possibile leggere il valore di questa proprietà (TipoCampo) da una funzione javascript (lato client).

Graziie e saluti
Stefano
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
sì, è possibile, basta far arrivare il suo valore al client, includendolo nell'output generato dal controllo.

Io farei così: copierei il valore della proprietà TipoCampo su un attributo alla Textbox. In HTML 5 infatti hai la possibilità di definire attributi personalizzati; sono i cosiddetti data attributes.

Un buon momento per copiare tale valore è al PreRender. Metti questo override nella classe del tuo controllo:
protected override void OnPreRender(EventArgs e)
{
   this.Attributes["data-tipocampo"] = TipoCampo;
   base.OnPreRender(e);
}


Lato client, potrai recupare questo valore con una chiamata javascript tipo questa:
var tipo = document.getElementById("idtuocontrollo")["data-tipocampo"];

Così dovresti cavartela.

steual ha scritto:

ho aggiunto delle funzioni javascript (lato client) per formattare/controllare il contenuto del campo stesso


Ok, tieni presente che per la validazione del contenuto puoi anche contare sui Validator Controls.

ciao,
Modificato da BrightSoul il 18 novembre 2011 21.35 -

Enjoy learning and just keep making
113 messaggi dal 27 ottobre 2005
Ciao,
grazie per la risposta e per esserti interessato al mio problema, ma sopratutto "MILLE GRAZIE" per tutti i tuoi suggerimenti che ho applicato alla lettera e che funzionano perfettamente. Mi hai risolto un "grande" problema!

grazie ancora
Stefano
113 messaggi dal 27 ottobre 2005
Ciao, forse ho cantato vittoria troppo presto o forse sbaglio qualche cosa:
nel mio WebControl, otre ad aver aggiunto gli script lato client (javascript), lato server ho aggiunto il seguente codice VB.NET:

Private m_TipoDato As String

Public Property TipoDato() As String
Get
TipoDato = m_TipoDato
End Get
Set(ByVal value As String)
m_TipoDato = value
End Set
End Property

Protected Sub CampoNumerico_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles CampoNumerico.PreRender
CampoNumerico.Attributes("data-TipoDato") = TipoDato
MyBase.OnPreRender(e)
End Sub

Nella mia pagina (Pagina.aspx) ho incluso il mio controllo due volte (2 campi distinti):

<uc3:CampoNumerico ID="CampoNumericoDEC" runat="server" TipoDato="DEC"/>
<uc3:CampoNumerico ID="CampoNumericoINT" runat="server" TipoDato="INT"/>

nel WebControl, lato client, ad ogni tasto premuto (onKeyPress), ho inserito la seguente "alert" per visualizzare il contenuto della mia proprietà "TipoDato":

alert(document.getElementById('<%= CampoNumerico.ClientID %>').getAttribute('data-TipoDato'))

ma per entrambi i controlli viene sempre visualizzato il valore "INT" (che corrisponde all'ultimo controllo inserito nella pagina: "CampoNumericoINT")

Dove sbaglio ?

Grazie
Stefano
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
ispeziona il codice html prodotto dalla tua pagina e controlla se il valore di data-TipoDato sui due controlli è effettivamente quello che ti aspetti.

Poi, assicurati anche che ci siano due alert, una per il controllo chiamato CampoNumericoDEC e una per l'altro, chiamato CampoNumericoINT.
alert(document.getElementById('<%= CampoNumericoDEC.ClientID %>').getAttribute('data-TipoDato'))

alert(document.getElementById('<%= CampoNumericoINT.ClientID %>').getAttribute('data-TipoDato'))
Oppure prova a fare semplicemente:
<uc3:CampoNumerico ID="CampoNumericoDEC" runat="server" TipoDato="DEC" onkeypress="javascript:alert(this['data-TipoDato'])" />
<uc3:CampoNumerico ID="CampoNumericoINT" runat="server" TipoDato="INT" onkeypress="javascript:alert(this['data-TipoDato'])" />


Inoltre, non sono molto ferrato in Vb.Net ma penso che nel tuo WebControl tu debba fare un ovverride di PreRender.
Protected Overrides Sub OnPreRender(e As EventArgs)
   CampoNumerico.Attributes("data-TipoDato") = TipoDato
   MyBase.OnPreRender(e)
End Sub


ciao,

Enjoy learning and just keep making
113 messaggi dal 27 ottobre 2005
Ciao, grazie per la risposta. Nel sorgente HTML ho:

alert(document.getElementById('CampoNumericoDEC_CampoNumerico').getAttribute('data-TipoDato'));

<input name="CampoNumericoDEC$CampoNumerico" type="text" id="CampoNumericoDEC_CampoNumerico" class="Text_Abi" onKeyPress="return NumbersOnly(event, false)" data-TipoDato="DEC" />


alert(document.getElementById('CampoNumericoINT_CampoNumerico').getAttribute('data-TipoDato'));

<input name="CampoNumericoINT$CampoNumerico" type="text" id="CampoNumericoINT_CampoNumerico" class="Text_Abi" onKeyPress="return NumbersOnly(event, false)" data-TipoDato="INT" />

Mi sembra che i valori/parametri siano stati sostitui ed interpretati correttamente! inoltre lato server ho sotituito la precedente procedura con la tua "Protected Overrides Sub OnPreRender(ByVal e As EventArgs) .."

Ma il risultato è lo stesso, l'alert su entrambi i campi continua a visualizzare il parametro "INT" !!

ciao e grazie
Stefano
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, sì quella porzione di codice è corretta ma penso che ci sia un errore nella funzione NumbersOnly che viene invocata al keypress.
Infatti, entrambi i controlli la invocano con gli stessi parametri. Come fa la funzione ad identificare il controllo che l'ha invocata? Secondo me dovresti passarle un terzo parametro this, che è una referenza al controllo chiamante.

quindi, per esempio:
<input name="CampoNumericoINT$CampoNumerico" type="text" id="CampoNumericoINT_CampoNumerico" class="Text_Abi" onKeyPress="return NumbersOnly(event, false, this)" data-TipoDato="INT" />
e la funzione dovrà tener conto di quel terzo parametro

function NumbersOnly(evento, flag, controllo){
alert(controllo["data-TipoDato"]);
//qui metti il tuo codice
}


ciao,
Modificato da BrightSoul il 22 novembre 2011 23.32 -

Enjoy learning and just keep making
113 messaggi dal 27 ottobre 2005
Ciao,

hai perfettamente ragione. Nel codice HTML ho la stessa funzione javascript ("NumersOnly") ripetuta "enne" volte quanti sono i controlli inseriti nella mia pagina ...
La tua soluzione risolve il problema, resta il fatto che se nella mia pagina utilizzo il WebControl per esempio 5 volte, avrò ripetuta la stessa funzione per altrettante volte ... ! che non mi sembra il "massimo"... forse devo trovare un'altra strada/soluzione !

ciao e grazie 1000 ancora !
Stefano

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.