PlaceHolder e textbox
-
giovedì 12 aprile 2012 13:33
ciao a tutti, problema "banale" ma credo mi sfugga qualcosa
ho una pagina con 1 placeholder nel quale da code behind aggiungo textbox e 2 validator
Dim Txb As New TextBox
Txb.ID = "Txb2"
Txb.MaxLength = 30ph1.Controls.Add(Txb)
ect
Il tutto funziona, poi ovviamente dal click di un bottone asp:button fuori dal placeholder vorrei leggere il valore della texbox
Dim txb As TextBox = CType(ph1.FindControl("Txb2"), TextBox)ma è sempre nothing. il count dei controlli è 0
IO l'aggiunta la faccio nel page load "if not page.ispostback" ma a questo punto vedo che il placeholder non mi "tiene" i controlli.
sapete come posso fare ?
Tutte le risposte
-
giovedì 12 aprile 2012 14:03PostatoreI controlli aggiunti dinamicamente non vengono inseriti nel ViewState, quindi ad ogni postback della pagina li devi ricreare.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
giovedì 12 aprile 2012 14:17
e quindi non serve a nulla mettere il textbox se poi non posso ottenere il valore
ma questo come fà ?
http://www.c-sharpcorner.com/uploadfile/kaunainbaig/creating-dynamic-textbox-and-get-its-value/
a mè non risulta
-
giovedì 12 aprile 2012 14:36Postatore
Non è esattamente il tuo scenario. Tu hai detto che aggiungi la TextBox solo se non stai eseguendo un postback.
Invece, come puoi vedere nell'articolo che hai segnalato tu stesso, la TextBox è ricreata ad ogni postback (non c'è nessun controllo sulla proprietà IsPostBack): in questo modo, la casella di testo viene sempre aggiunta alla pagina, e quindi sarai in grado di recuperarne il riferimento e il contenuto usando il metodo FindControl.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva- Modificato Marco MinervaMicrosoft Community Contributor, Editor giovedì 12 aprile 2012 14:37
-
giovedì 12 aprile 2012 14:48
?? veramente io mettevo così perchè immaginavo ci fossero problemi ad inserirla sempre.
Cmq inserendo sempre la textbox e relativi control sempre ottengo l'errore che non ci possono essere 2 controlli con lo stesso id
allora stabilisco io l'id del textbox in maniera random in modo da poterli sempre aggiungere ma poi il valore non lo riesco a catturare ugualmente
-
giovedì 12 aprile 2012 15:05Postatore
?? veramente io mettevo così perchè immaginavo ci fossero problemi ad inserirla sempre.
Prova ad eseguire l'esempio del link che hai segnalato e vedrai che non c'è nessun problema. Anzi, come ti ho detto, questo è l'unico metodo possibile.
Cmq inserendo sempre la textbox e relativi control sempre ottengo l'errore che non ci possono essere 2 controlli con lo stesso id
Con "inserendo sempre" intendi senza fare il controllo sul postback? Puoi mostrare il codice che stai utilizzando?
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
giovedì 12 aprile 2012 15:10
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
AggiuntaTxbSempreDiverso()
End If
End SubSub AggiuntaTxbSempreDiverso()
Dim Txb As New TextBox
Txb.ID = "Txb" & AxLib.UtGen.GenerRndPassw(6)
Txb.MaxLength = 30
ViewState("NomeTextBox") = Txb.ID
Dim rfv As New RequiredFieldValidator
rfv.ControlToValidate = Txb.ID
rfv.ErrorMessage = "username obbligatoria"
Dim rev As New RegularExpressionValidator
rev.ControlToValidate = Txb.ID
rev.ErrorMessage = "Caratteri non validi"
rev.ValidationExpression = "^[.a-zA-Z0-9_ ]*$"
ph1.Controls.Add(Txb)
ph1.Controls.Add(rfv)
ph1.Controls.Add(rev)
End SubPrivate Sub btnEntra1_Click(sender As Object, e As System.EventArgs) Handles btnEntra1.Click
If Page.IsValid Then
Dim usern As String = String.Empty
Dim txb As TextBox = CType(ph1.FindControl(ViewState("NomeTextBox")), TextBox)If Not txb Is Nothing Then
usern = txb.Text.Trim
Else
Response.Write("no")
End If..
in ogni caso se dentro il button_click stampo ph1.controls.count ottengo = 0
-
giovedì 12 aprile 2012 15:14lavoro in asp.net 4 con pagina all'interno di una masterpage, ma non credo che questo sia il problema
-
giovedì 12 aprile 2012 15:37Postatore
Ho voluto provare io stesso il tuo codice: se togli il controllo sul postback dall'evento Page_Load e in AggiuntaTxbSempreDiverso usi un ID fisso per la TextBox, tutto funzionerà correttamente.Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva- Contrassegnato come risposta Alessandro Andreatta venerdì 13 aprile 2012 06:38
-
giovedì 12 aprile 2012 18:54
oh bella ??! non mi resta che provare domani in ufficio
grazie come sempre
ciao !
-
venerdì 13 aprile 2012 06:38
ok grazie marco ora tutto funziona
bastava correggere con
Sub AggiuntaTxbSempreDiverso()
If Not Page.IsPostBack Then
ViewState("NomeTextBox") = "Txb2" & AxLib.UtGen.GenerRndPassw(6)
End If
Dim Txb As New TextBox
Txb.ID = ViewState("NomeTextBox")
Txb.MaxLength = 30
'ViewState("NomeTextBox") = Txb.ID
Dim rfv As New RequiredFieldValidator
rfv.ControlToValidate = Txb.ID
rfv.ErrorMessage = "username obbligatoria"
Dim rev As New RegularExpressionValidator
rev.ControlToValidate = Txb.ID
rev.ErrorMessage = "Caratteri non validi"
rev.ValidationExpression = "^[.a-zA-Z0-9_ ]*$"
ph1.Controls.Add(Txb)
ph1.Controls.Add(rfv)
ph1.Controls.Add(rev)
End SubPerchè l'esigenza era proprio quella di avere un id del textbox diversa e random ad ogni caricamento.
Potrebbe essere una piccola soluzione contro attacchi Brute Force ?
-
venerdì 13 aprile 2012 07:32Postatore
Perchè l'esigenza era proprio quella di avere un id del textbox diversa e random ad ogni caricamento.
Potrebbe essere una piccola soluzione contro attacchi Brute Force ?
Non credo :-)
Una soluzione semplice è mettere filtri più a basso livello, ad esempio un HttpModule che controlla le richieste che arrivano al sito: se ad esempio ne arrivano più di X nell'arco di Y minuti, consideri le richieste provenienti da quell'IP come "pericolose" e quindi le blocchi sul nascere.
Marco Minerva [MCPD]
Blog: http://blogs.ugidotnet.org/marcom
Twitter: @marcominerva -
venerdì 13 aprile 2012 08:30
divago un pò, ma se dovessi fare uno spider (e ho già fatto una cosa simile) per dare un'idea, sarebbe comodo che il campo rimanesse sempre quello in modo da generare una serie di post alla pagina con cui iterare su diversi dizionari per poi catturare l'http di output generato.
no ? certo protresti andarti a leggere il nome chiedendo prima la pagina in get, ma comincia ad allungarsi un pò il giro.
se poi non consenti tentativi di log da parte dello stesso utente entro diciamo 3 secondi, pensavo fosse già qualcosa.Cmq tengo presente la soluzione del module.
ciao grazie

