2010-01-21 40 views
16
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
       <ContentTemplate> 
         <asp:FileUpload onchange="clickTheButton();" ID="FileUpload1" runat="server" /> 
       </ContentTemplate> 
       <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="Button1" /> 
       </Triggers> 
</asp:UpdatePanel> 

botón 1 está fuera del panel de actualización y el código JavaScript que se ejecute cuando un usuario agrega un archivo en la caja de carga es la siguiente:¿FileUpload no funciona cuando está anidado en UpdatePanel? C#

function clickTheButton() { 
      document.getElementById('<%= Button1.ClientID %>').click(); 
     } 

El problema es simple. FileUpload1.HasFile == falso. No sé por qué es así, pero cuando lo pongo en el panel de actualización deja de funcionar.

He visto algunos otros hilos en esto. Pero ninguno de ellos responde por qué sucede esto, solo apuntan a cosas que puedes descargar.

EDIT: Realmente la razón principal por la que quiero hacer esto es para poder obtener una .. Etiqueta de archivo ..Uploading .. para que aparezca mientras el cliente carga el servidor y una vez que se haya completado, muéstrelo en un datalist Simplemente no puedo hacer que UpdateProgress funcione.

Respuesta

14

Básicamente solo necesita hacer que su botón haga una devolución de datos completa para enviar el archivo. También asegúrese de tener this.Form.Enctype = "multipart/form-data"; establecer en su código, o puede poner en esa página. AsyncPostbacks no funcionan con archivos por razones de seguridad como se menciona, sin hacks. (Nunca he podido hacer que funcione).

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:FileUpload onchange="clickTheButton();" ID="FileUpload1" runat="server" /> 
     </ContentTemplate> 
     <Triggers> 
     <asp:PostBackTrigger ControlID="Button1" /> 
     </Triggers> 
</asp:UpdatePanel> 
+0

El progreso de la actualización no funciona con una devolución de datos completa, ¿verdad? – Jason

+0

Correcto, no tendrá una forma de controlar el progreso, excepto si su navegador muestra una barra de carga durante la devolución de datos, que no parece ser una forma confiable en todos los navegadores. – jamone

+0

esto es muy viejo, ahora podemos devolverlo a través de js, pero ¿cómo? – Adeem

4

Por motivos de seguridad, los navegadores no le permiten publicar archivos a través de javascript. Imagínese si pudiera escribir un poco un javascript para enviar asíncronamente el contenido de su carpeta Mis documentos a mi servidor.

Así que los métodos javascript-ish de publicar el formulario, como el XMLHttpRequest utilizado por el UpdatePanel, no funcionarán.

Esta publicación describe un trabajo decente si estás en 3.5 SP1. http://geekswithblogs.net/ranganh/archive/2009/10/01/fileupload-in-updatepanel-asp.net-like-gmail.aspx

Y esta publicación describe un par de soluciones si prefiere no utilizar el AjaxControlToolkit. http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspx

0

La carga de archivos no funcionará con una devolución parcial de la publicación. Entonces sólo tiene que añadir esta línea a su carga de la página

ScriptManager.GetCurrent(this).RegisterPostBackControl(this.YourControlID); 

O utilice PostBackTrigger.

<Triggers> 
      <asp:PostBackTrigger ControlID="YourControlID" /> 
</Triggers> 

O Necesita control AsyncFileUpload especial como se define en AjaxControl Toolkit.

<ajaxToolkit:AsyncFileUpload OnClientUploadError="uploadError" 
    OnClientUploadComplete="uploadComplete" runat="server" 
    ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern" 
    UploadingBackColor="#CCFFFF" ThrobberID="myThrobber" /> 

Puede consultar here.

Cuestiones relacionadas