Oggetto asp:FileUpload e postback

lunedì 03 maggio 2010 - 18.15

cicemoi Profilo | Junior Member

Salve,
nella mia pagina ho utilizzato un oggetto di tipo "asp:FileUpload" (<asp:FileUpload ID="fulDataDeliberaAut" runat="server"></asp:FileUpload>) per fare l'upload dei file, solo che ad ogni postback, compreso quello di conferma, si perde il valore che ho allegato
C'è un modo per non perdere il valore?

Grazie mille
Ciao

Pinky Profilo | Junior Member

Dato che ad un postback con tale controllo valorizzato vengono inviati TUTTI i byte del file puntato dal percorso indicato nel controllo stesso, è probabile che Microsoft abbia volutamente non aggiunto la funzionalità di mantenimento del valore in esso (come invece avviene ad esempio per un comune TextBox).
Se per questo o per un altro motivo non lo so, sta di fatto che tale comportamento impedisce un eventuale ri-invio del file se proprio non c'è la sicurezza di volerlo inviare.
Penso che stia allo sviluppatore fare si che l'utente invii il file una volta sola, ovvero compili correttamente tutti gli eventuali altri campi obbligatori.
Daltra parte è anche possibile memorizzare il file inviato la prima volta che viene inviato il form e poi utilizzarlo solo e se gli altri dati necessari vengono inviati successivamente e correttamente, in modo cioè che non si invii TUTTE le volte anche il file.

Non so se tramite javascript sia possibile snaturare tale comportamento e ri-valorizzare il controllo con il percorso già utilizzato, ne se anche riuscendoci il file puntato da tale percorso sia realmente ri-inviato al server, visto che comunque verrebbe a mancare la pressione del tasto "browse", può essere un esperimento interessante...

Rimane il fatto che non si capisce perchè hai necessità di un tale comportamento, davvero vuoi inviare lo stesso file più volte?

Ciao
Alessandro

cicemoi Profilo | Junior Member

no non voglio inviare il file più volte, solo che, essendoci nel form più controlli con l'autopostback, ogni volta che questo scatta si perde il valore.........

Pinky Profilo | Junior Member

E' una situazione nella quale il mantenimento del valore può essere "comodo", infatti se presente una semplice DropDownList che necessita spesso dell'AutoPostBack è scomodo perdere il file.
E' anche vero che tale file viene inviato anche se non strettamente necessario in quel momento.

Mi viene in mente questa soluzione: fai apparire il controllo FileUpload solo dopo che gli altri controlli sono "a posto".

Stamane non sono in grado di effettuare delle prove, mi riprometto di fare qualche test nel pomeriggio (spoprattutto javascript).

.......

Intanto però ho appena usato nel Page_Load questo:
// check if file upload is sent
if (IsPostBack)
{
if(fileUpload.HasFile)
{
lblMessage.Text += " file upload";
}
}

lblMessage.Text += " content length: " + Request.ContentLength;

... direi che è comunque sconsigliabile inviare sempre del contenuto che non sarà usato, e se metti i controlli con autopostback in un UpdatePanel?

Ciao
Alessandro

Pinky Profilo | Junior Member

Sinceramente non ho indagato molto ma per questioni di sicurezza forse è impedito impostare la proprietà value di un input type="file" come questo chiaro esempio fa capire:
http://forum.html.it/forum/showthread/t-1131764.html, in pratica si potrebbe far inviare dal client un file di un qualsiasi predefinito percorso solo facendo visitare la pagina.

Avevo provato così:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Se non ci sono impedimenti basta inserire i controlli in un UpdatePanel e lasciare nella parte statica della pagina il FileUpload, ed il gioco è fatto.

Ciao
Alessandro

cicemoi Profilo | Junior Member

ho scelto di mettere tutta la tabella con i controlli che fanno autopostback e non e con i controlli che fanno l'upload all'interno di un updatePanel in questo modo:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<table>
.........................
</table>
</ContentTemplate>
</asp:UpdatePanel>

ma la situazione non cambia..non fa il refresh della pagina a livello visivo...ma al postabk delle dropDownlist che fanno autospostback si perde il valore
devo forse creare tanti updatePanel quanti sono i controlli che lo fanno scattare o devo mettere i controlli ceh fanno l'upload negli updatePanel?

é la prima volta che li uso........

grazieeeeeeeeeeeeeeeeeeeee

Pinky Profilo | Junior Member

Se il posizionamento dei controlli all'interno della pagina lo richiede, si possono usare più di un UpdatePanel,
l'importante è che i controlli FileUpload (ed il bottone di invio) ne rimangano fuori. Mi pare che tu non abbia rispettato questa "regola" da ciò che dici.

In questo semplice esempio il valore viene mantenuto alla selezione della combo.
Viene invece "perso" nel momento in cui venga inviato tutto il "modulo", cioè alla pressione del tasto di invio, ed è l'unico momento in cui i byte del file sono inviati al server.

<asp:FileUpload runat="server" ID="file_1" />

<asp:UpdatePanel runat="server"> <ContentTemplate>
<asp:DropDownList runat="server" ID="cboColor" AutoPostBack="true" OnSelectedIndexChanged="cboColor_SelectedIndexChanged">
<asp:ListItem>Red</asp:ListItem> <asp:ListItem>Green</asp:ListItem> <asp:ListItem>Blue</asp:ListItem>
</asp:DropDownList>
</ContentTemplate> </asp:UpdatePanel>

<asp:Button runat="server" Text="Confirm" OnClick="btnTest_Click" />

Dato che dici di non averlo mai usato (ed anche se off-topic) spreco due parole sull'argomanto (assolutamente non esaustive ne prive di errori)...
L'UpdatePanel è un modo per dire che una parte di pagina può essere aggiornata dinamicamente, ovvero senza un completo invio della stessa (come evviene invece su un postback normale). Si parla infatti di AsyncPostback. Perchè questo accada il Framework si occupa di creare tutto il javascript necessario e di gestire la richiesta tramite AJAX, in maniera trasparente per l'utente.
Se metti il controllo di upload nella parte di pagina dinamica (non ho provato) viene inviato (il suo contenuto e tutte le sue proprietà, il suo stato insomma) al server. Ed alla risposta ajax ottenuta il codice javascript creato apposta dal Framework si occupa di sostituire/modificare la parte di pagina coinvolta e solo questa. Tanto è vero che nell'elaborazione lato server di un postback asincrono se vai modificare una qualche proprietà di un controllo fuori da un UpdatePanel viene sollevata una Exception.
I benefici (tanto pubblicizzati) sono una chiara diminuzione di traffico HTTP totale generato, anche a discapito di un piccolo "appesantimento" nel primo caricamento della pagina. Si ha solitamente anche una migliore user-experience, e questa è a volte una ragione sufficiente per ricorrervi, ma è bene non abusarne.

Ciao
Alessandro
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5