Sto cercando di caricare un file, non appena un utente lo seleziona. Devo soddisfare i seguenti requisiti:
- Il pulsante ha l'aspetto di altri pulsanti dell'applicazione.
- Il file viene caricato non appena l'utente lo seleziona.
- Ho bisogno che sia in un UpdatePanel poiché devo apportare aggiornamenti condizionali alla pagina. I CAN fare un postback completo sul file selezionato (a.k.a
onchange
) evento.
codice attuale
seguito è come il mio file vista sembra:
<asp:UpdatePanel ID="upData" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<div style="width: auto; float: right;">
<asp:Button ID="btnFileImportSkin" CssClass="ButtonSkin AddButton" Text="Import" Style="position: absolute; z-index: 2;" runat="server" OnClientClick="Javascript:onImport(); return false;" />
<asp:FileUpload ID="fileImport" Visible="false" Style="position:relative; opacity:0;" runat="server" onchange="Javascript:onFileSelected();" />
<%-- onchange="Javascript:this.form.submit();" /> --%>
<%-- <asp:Button ID="btnUpload" runat="server" OnClientClick="Javascript:alert('Uploading...'); __doPostBack('<%= btnUpload.ID %>', ''); return false;" /> --%>
<asp:Button ID="btnUpload" OnClick="btnUpload_Click" runat="server" />
</div>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="btnUpload" />
</Triggers>
</asp:UpdatePanel>
Rilevante Javascript:
<script type="text/javascript">
function onImport() {
var fileImportClientId = '<%= fileImport.ClientID %>';
document.getElementById(fileImportClientId).click();
}
function onFileSelected() {
alert("File Selected");
// I have tried calling the function directly and with a timeout
setTimeout(onUpload, 20);
}
function onUpload() {
var btnUploadClientId = '<%= btnUpload.ClientID %>';
document.getElementById(btnUploadClientId).click();
}
</script>
codice dietro:
protected void btnUpload_Click(object sender, EventArgs e)
{
// PostedFile is null first time code gets here on user selecting a file
if (fileImport.PostedFile != null)
{
if (fileImport.PostedFile.FileName.Length > 0)
{
ImportFromFile();
}
}
}
01 scatta
Spiegazione/flusso
- utente su
btnFileImportSkin
tasto. - Si chiama la funzione
onImport
, che fa clic programmaticamente sul pulsantefileimport
. - L'utente seleziona un file e preme Apri.
onFileSelected
viene chiamato.onUpload
viene chiamato correttamente.btnUpload_Click
viene chiamato con successo ogni volta.
Tuttavia il problema è che
fileImport.PostedFile è nullo l'utente prima volta seleziona un file. Tutto funziona bene la seconda volta e da lì in poi.
correlati
This question è strettamente legato al mio problema, ma il PO probabilmente voleva una soluzione di upload Async come in Gmail. Ho già provato a fare il seguente come nelle risposte a questa domanda:
- __doPostBack() in caso di OnClientClick
btnUpload
- this.form.submit() onchange evento dal mio controllo
FileUpload
. - impostazione dell'attributo onchange di
FileUpload
controllo Page_PreRender
note aggiuntive
- Questa cosa ha funzionato perfettamente quando non ho avuto pannelli di aggiornamento. Stavo facendo this.form.submit() direttamente nell'evento onchange del controllo
FileUpload
. - framework di destinazione è .NET 4,0
NOTA: Aggiunto un Visible = "false" in FileUpload
controllo di cui sopra. Era il problema ma l'avevo ignorato mentre facevo domande.
Sia html che javascript si trovano in un controllo utente. –
Sei sicuro che funzioni la prima volta? Funziona anche per me quando clicco su "btnFileImportSkin' la seconda volta. –
Sì, lo sono, 110%. :) Faccio clic sul pulsante solo una volta e il codice raggiunge il punto di interruzione la prima volta, ogni volta. – BeeTee2