2010-09-30 19 views
8

Ho un controllo FileUpload e un controllo DropDownlist in un UpdatePanel e quando l'utente seleziona un file per il controllo FileUpload (nessun caricamento ancora), nel frattempo l'utente seleziona un'opzione dal controllo DropDownList che causerà un postback! Una volta che il postback della pagina, il percorso selezionato nel controllo FileUpload sarà andato. Come posso mantenere il percorso nel controllo FileUpload? Funzionava la funzione di caricamento dei file. Spero possa rimanere il percorso nel controllo FileUpload durante il postback.Percorso residuo del controllo FileUpload dopo il postback

Ho provato la soluzione in basso ma "FileUpload1.HasFile" restituirà false a me.

  If Session("FileUpload1") Is Nothing AndAlso Upload.HasFile Then 
       Session("FileUpload1") = Upload 
       lblPhotoUploadErr.Text = Upload.FileName 
      ElseIf Session("FileUpload1") IsNot Nothing AndAlso (Not Upload.HasFile) Then 
       Upload = DirectCast(Session("FileUpload1"), FileUpload) 
       lblPhotoUploadErr.Text = Upload.FileName 
      ElseIf Upload.HasFile Then 
       Session("FileUpload1") = Upload 
       lblPhotoUploadErr.Text = Upload.FileName 
      End If 

ma il "Upload.HasFile" nella funzione di caricamento sottostante sarà true quando è stato eseguito.

Public Sub uploadPhoto() 
    Dim FileOK As Boolean = False 
    Dim FileSaved As Boolean = False 
    Dim CandidateCode As String = Nothing 
    Dim newFileName As String = Nothing 

    Dim extension As String = Nothing 
    Dim fileNameWithoutExt As String = Nothing 

    If txtCandidateCode.Text.Trim <> "" Then 
     CandidateCode = txtCandidateCode.Text.Trim 
    End If 

    If Upload.HasFile Then 
     Dim FileExtension As String = Path.GetExtension(Upload.FileName).ToLower 
     Dim allowedExtensions() As String = {".png", ".jpeg", ".jpg", ".gif"} 

     Dim i As Integer = 0 
     Do While (i < allowedExtensions.Length) 
      If (FileExtension = allowedExtensions(i)) Then 
       FileOK = True 
      End If 
      i = (i + 1) 
     Loop 
    End If 

    If FileOK Then 
     Try 
      fileNameWithoutExt = Path.GetFileNameWithoutExtension(Upload.FileName) 
      extension = Path.GetExtension(Upload.FileName) 
      newFileName = fileNameWithoutExt + "_" + CandidateCode + extension 

      Upload.PostedFile.SaveAs((path1 + newFileName)) 
      FileSaved = True 
     Catch ex As Exception 
      lblPhotoUploadErr.Text = ("File could not be uploaded." + ex.Message.ToString) 
      FileSaved = False 
     End Try 
    Else 
     lblPhotoUploadErr.Text = "Cannot accept files of this type." 
    End If 

    If FileSaved Then 
     pnlUpload.Visible = False 
     imgPhoto.ImageUrl = ("~/images/" + newFileName) 
     hfPhotoUploadPath.Value = ("~/images/" + newFileName) 

     hfFileExtension.Value = extension 
     hfPhotoUploadFileName.Value = fileNameWithoutExt 
    End If 
End Sub 

risposta

3

Il dropDown deve essere postback? Penso che il fileupload non funzioni all'interno di updatePanels per motivi di sicurezza. Vedi qui:

http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspx

+0

Sì! Il menu a discesa richiede il postback! In realtà, ho fatto il fileupload per funzionare all'interno di un updatepanel e funziona benissimo! –

+0

Come hai fatto a farlo funzionare? – adrianos

+0

Ho aggiunto "Page.Form.Attributes.Add (" enctype "," multipart/form-data ")" in Page_Load e ho un PostBackTrigger per il pulsante di caricamento. –

-1

Perché non disattivare il menu a discesa quando l'utente invia il modulo.

  • Qualcosa di simile ...

    OnClientClick = "$ ('discesa') attr ('disabilitato', true);. Return true;"

sul pulsante?

10

FileUpload manterrà il valore solo se lo si estrae da UpdatePanel. In questo modo puoi ancora fare tutto con DropDownList e il suo AutoPostBack ma il postback di ajax non aggiornerà il FileUpload facendolo diventare vuoto. In questo modo non hai più bisogno dei postbacktriggers.

Mettere il UpdatePanel solo intorno alla DropDownList e qualsiasi controllo il postback deve cambiare. Se questi controlli non sono uno accanto all'altro, puoi utilizzare più UpdatePanel, l'AutoPostBack li aggiornerà tutti (comportamento predefinito, puoi persino cambiarlo).

1

Impostare la modalità UpdatePanel su condizionale e posizionare un altro UpdatePanel a capo del menu a discesa. In questo modo il menu a discesa non pubblicherà il file.

Se si desidera effettuare un caricamento di file asincrono, non sarà possibile, ma è possibile simularlo.

Dai uno sguardo allo this project, cambia il target di form, quindi nulla sulla tua pagina cambierà, pubblicherà su un iframe.

2

Credo di avere trovato una soluzione:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     Session["FileUpload1"] = null; 
    } 
    else 
    { 
     if (FileUpload1.HasFile) 
     { 
      Session["FileUpload1"] = FileUpload1; 
      TextBox1.Text = FileUpload1.FileName; 
     } 
     else if (Session["FileUpload1"] != null) 
     { 
      FileUpload1 = (FileUpload)Session["FileUpload1"]; 
      TextBox1.Text = FileUpload1.FileName; 
     } 
    } 
} 

 

<span class="spanFu"> 
    <asp:TextBox ID="TextBox1" Text="Select a file..." runat="server" CssClass="txt" ReadOnly="true" /> 
    <asp:FileUpload ID="FileUpload1" runat="server" onchange="File_OnChange(this)" CssClass="fu" /> 
</span> 

<script> 
function File_OnChange(sender) { 
    val = sender.value.split('\\'); 
    document.getElementById('<%= TextBox1.ClientID %>').value = val[val.length - 1]; 
} 
</script> 

<style> 
.spanFu .txt { width: 200px; height: 20px; } 
.spanFu { position: relative; overflow: hidden; vertical-align: top; } 
.fu { z-index: 1; width: 200px; height: 24px; position: absolute; top: 0px; 
    left: 0px; filter: alpha(opacity=0); opacity: .0; } 
</style> 
2

Metti la tua controllo FileUpload al di fuori del UpdatePanel in modo che il postback asincrono causata dal DropDownList non influenzerà il controllo FileUpload.Esempio (semplificato):

<asp:FileUpload runat="server" /> 

<asp:UpdatePanel runat="server"> 
    <asp:dropdownlist runat="server" autopostback="true" /> 
</asp:UpdatePanel> 

<asp:button runat="server" text="Submit" /> 

Nota aggiuntiva: sembra che si stia memorizzando il controllo FileUpload nella sessione. Non è davvero una buona idea e potrebbe portare qualche problema, ad es. quando i tuoi utenti aprono la stessa pagina utilizzando più schede/finestre del browser. E, penso che quello che potresti voler fare è salvare il nome file/filebyte/altri attributi del controllo fileupload, invece di memorizzando il controllo intero nella sessione che mangerà più risorse del tuo server.

Problemi correlati