Con risposta 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 = 30

    ph1.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:03
    Postatore
     
     
    I 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:36
    Postatore
     
     

    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

  • 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:05
    Postatore
     
     
    ?? 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 Sub

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

    Private 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:14
     
     
    lavoro in asp.net 4 con pagina all'interno di una masterpage, ma non credo che questo sia il problema
  • giovedì 12 aprile 2012 15:37
    Postatore
     
     Con risposta
    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

  • 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 Sub

    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 ?

  • venerdì 13 aprile 2012 07:32
    Postatore
     
     

    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