Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Repeater senza viewstate, come salvare?

    Salve,

    in una pagina ho un repeater che visualizza 6 righe dati.
    Ogni riga dati ha solo un paio di label ed un altro repeater che mostra invece molte righe, il tutto bindato a due List<T> da codice
    quidni il secondo ItemTemplate contiene 4 TextBox e 2 CheckBox con Bind("....")

    Per ovvi motivi, ho disabilitato il viewstate dei repeater.

    bene, ora non riesco più a salvare i dati. Mi sono perso in un bicchiere d'aqcua, lo ammetto.
    Se qualcuno ha la pazienza di dirmi come devo fare il giro giusto per bindare i dati, mi salva la vita.

    ciao grazie

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Non conoscendo il codice vado ad intuito.
    Io faccio così:
    sto alla larga per quanto è possibile dati controlli server. In questo caso non metterei TextBox ma <input type text. Per recuperare i dati ho cura di dare un name scritto in modo tale da poterli recuperare poi con Request.Form

    di più non so

    Pietro

  3. #3
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    penso che senza viewestate al massimo puo funzionare Eval("expr") e non Bind.
    questo significa che in qualche modo il salvataggio lo devi fare con un pulsante collegato ad una funzione che fa il lavoro manualmente (niente bind).

    A questo punto per semplificare le cose poiche come dici le righe sono "soltanto" sei invece che cercare di beccare la riga su cui i dati sono stati modificati io salverei l'intera lista e metterei un unico pulsante salva fuori dal repeater piu esterno.

  4. #4
    Originariamente inviato da rsdpzed
    penso che senza viewestate al massimo puo funzionare Eval("expr") e non Bind.
    questo significa che in qualche modo il salvataggio lo devi fare con un pulsante collegato ad una funzione che fa il lavoro manualmente (niente bind).
    si, infatti ho fatto così.
    un pulsante nella pagina che dovrebbe salvare i dati e riporporli come datasource ai repeater. Il problema è che non riesco a leggere i dati nei repeater

    A questo punto per semplificare le cose poiche come dici le righe sono "soltanto" sei invece che cercare di beccare la riga su cui i dati sono stati modificati io salverei l'intera lista e metterei un unico pulsante salva fuori dal repeater piu esterno.
    Confermo, ogni volta salvo tutti i dati per intero ricreando la struttura delle list, o perlomeno questo è quello che vorrei fare, ma non capisco perché non riesco a reperire i dati.
    Dunque, questo è quello che faccio:

    caricamento pagina
    Load -> carico dal database e metto nella struttura di liste
    prerender -> bindo le strutture ai controlli repeater

    postback
    load -> carico dal database e metto nella struttura di liste
    buttonclick -> vorrei salvare i dati, ma non li reperisco dai repeater
    prerender -> bindo le strutture ai controlli repeater.

    come si può intuire, i dati non sono cambiati... ;-)

  5. #5
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Vorrei provare prima di risponderti ma non posso ora.
    Ti rispondo a naso: secondo me l'errore è nel fatto che bindi le liste nel prerender ed invece dovresti farlo nel load. Nel prerender si suppone che l'oggetto .net che rappresenta il repeater abbia gia tutte le proprietà "a posto" e quello che fai in questa fase è qualcosa puramente visiva e comunque a livello di rendering html.

    nel momento in cui il buttonclick cerca i dati nel repeater l'evento prerender della pagina non è stato ancora lanciato ecco perche non li vedi...fammi sapere come va spostando il bind dal prerender al load

  6. #6
    attualmente ho il bind nel prerender perché è uno dei tanti tentativi che ho fatto.
    Spostando il bind dei dati nel load, perdo tutte le modifiche fatte nella pagina.

    Ovverto, inserisco i dati nei controlli, premo "salva", al load della pagina, quando faccio il bind, perdo i dati che ho appena inserito, e rivedo quelli precedenti.

    Sto diventando matto!!!!!!!!!!!!!!!!

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    io ho un esempio antico (molto antico )

    invece dei textbox metto per esempio

    <input type="text" value="<%# NullToString(Eval("testo"))%>" name="testo_<%# Eval("id")%>" />

    la parte fondamentale per recuperare i dati è name="testo_<%# Eval("id")%>"


    nel codice, evento load


    If Not Me.IsPostBack Then
    BindData()
    End If

    al clilck di un pulsante:
    1) recupero tutti i parametri form la cui chiave inizia (nel mio caso) per testo_
    2) per ogni chiave trovata ne recupero il value ed aggiorno i dati sottostanti
    3) alla fine: BindData()

    così va
    Pietro

  8. #8
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    in ogni modo è nel load che va no nel prerender.

    se al postback all'onload della pagina ricarchi i dati dal db nelle liste e bindi le liste ai repeater hai sovrascritto di fatto le modifiche che ti sono arrivate dal postback prima di avere la possibilità di aggiornare i dati. Quando hai il postback NON devi ricaricare i dati dal db. E' il button press che deve prima salvare, poi ricaricare i nuovi dati nelle liste ed infine ribindare le liste aggiornate ai repeater.

    quindi dal tuo messaggio precedente:

    caricamento pagina
    Load (no postback) -> carico dal database, riempi le liste, bindo le strutture ai controlli repeater


    postback
    load della pagina -> NON fare nulla
    buttonclick -> Salva i dati, ricarica le liste, binda le liste ai repeater.

  9. #9
    Originariamente inviato da rsdpzed
    postback
    load della pagina -> NON fare nulla
    buttonclick -> Salva i dati, ricarica le liste, binda le liste ai repeater.
    teoricamente hai ragione, ma non avendo il viewstate, il "SalvaDati" non riesco a farlo.
    i controlli repeater risultano vuoti!!!!

  10. #10
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Originariamente inviato da Gluck74
    teoricamente hai ragione, ma non avendo il viewstate, il "SalvaDati" non riesco a farlo.
    i controlli repeater risultano vuoti!!!!

    abiliti il viewstate almeno per il repeater oppure non usare il repeater e fai tutto via codice con due foreach annidati, almeno cosi puoi accedere alle textbox direttamente.
    Il problema è che anche in questo caso per via del meccanismo del postback c'è bisogno di una sorta di sistema per persistere i dati tra le varie ricieste. Questo perche al postback non hai le textbox (vengono create dinamicamente nei foreach) e per ricrearle con i nuovi dati dovresti recuperare i valori a mano dalla request. Non mi sembra un ottima idea anche perchè il viewstate oltre che essere piu sicuro e piu comodo e non ti fa fare questo brutto lavoro tutt'altro che typesafe.

    Secondo me abilita il viewstate almeno ai repeater (e controlla che la sua grandezza sia per te accettabile visto che il problema del vs è solo quello). Oppure passa a mvc e fai esattamente quello che volevi fare tu ma senza la rogna di avere un modello di programmazione scomodo (eventi) e avendo dalla tua il model binder e gli helper.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.