2010-09-30 21 views
8

Tengo un control FileUpload y un control DropDownlist en un UpdatePanel y cuando el usuario selecciona un archivo para el control FileUpload (sin carga aún), mientras tanto el usuario selecciona una opción del control DropDownList que causará una devolución de datos! Una vez realizada la devolución de página, la ruta seleccionada en el control FileUpload desaparecerá. ¿Cómo puedo seguir el camino en el control FileUpload? La función de carga de archivos estaba funcionando. Espero que pueda seguir siendo la ruta en el control FileUpload durante la devolución de datos.Mantener la ruta del control FileUpload después de la devolución

He intentado la solución a continuación, pero el "FileUpload1.HasFile" me devolverá falso.

  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 

pero el "Upload.HasFile" en la función de carga a continuación se cierto cuando se fue ejecutado.

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 

Respuesta

3

¿El dropDown necesita una devolución de datos? Creo que la carga de archivos no funciona en updatePanels por razones de seguridad. Ver aquí:

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

+0

Sí! ¡El menú desplegable necesita una devolución de datos! ¡De hecho, he hecho que la carga de archivos funcione dentro de un panel de actualización y funciona muy bien! –

+0

¿Cómo lo hiciste funcionar? – adrianos

+0

Agregué el "Page.Form.Attributes.Add (" enctype "," multipart/form-data ") en Page_Load y tengo un PostBackTrigger para el botón de carga. –

-1

Por qué no desactivar el menú desplegable cuando el usuario envía el formulario.

  • Algo así como ...

    OnClientClick = "$ ('desplegable') attr ('desactivado', true);. Return true;"

en el botón?

10

FileUpload solo conservará su valor si lo quita del UpdatePanel. De esta forma, puede hacer todo lo posible con la DropDownList y su AutoPostBack, pero la devolución de datos de ajax no actualizará FileUpload y hará que se vacíe. De esta manera ya no necesitas los postbacktriggers.

Coloque el UpdatePanel única en todo el DropDownList y cualquier control de la devolución de datos tiene que cambiar. Si estos controles no están uno al lado del otro, puede usar múltiples UpdatePanels, AutoPostBack los actualizará a todos (comportamiento predeterminado, incluso puede cambiar eso).

1

Establezca el modo UpdatePanel en condicional y coloque otro UpdatePanel que ajuste el menú desplegable. De esta forma, el menú desplegable no publicará el archivo.

Si desea hacer una carga de archivo asíncrono, no podrá hacerlo, pero puede fingirlo.

Eche un vistazo a this project, cambia el objetivo form, por lo que nada en su página cambiará, se publicará en un iframe.

2

creo que he encontrado una solución:

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

Deja tus fileupload de control fuera del UpdatePanel de modo que la devolución de datos asincrónica causada por la lista desplegable no afectará el control FileUpload.Ejemplo (simplificado):

<asp:FileUpload runat="server" /> 

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

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

Nota adicional: parece que va a guardar el control FileUpload en la sesión. No es realmente una buena idea y podría ocasionarle algún problema, p. cuando sus usuarios abren la misma página usando múltiples pestañas/ventanas del navegador. Y, creo que lo que podría querer hacer es guardar el archivo/filebyte/otros atributos del control de carga de archivos, en lugar de almacenando el control total en la sesión que consumirá más recursos de su servidor.

Cuestiones relacionadas