2010-02-22 8 views
11

Estoy tratando de utilizar el control AsyncFileUpload desde Asp.net Ajax Control Toolkit (30 de septiembre de 2009 build estable: 30930). Creé una aplicación de demostración y el control funciona bien. Cargar archivos y todo está bien.Asp.Net Ajax Toolkit AsyncFileUpload - "El archivo está adjunto no es válido" error

Cuando trato de utilizar el control en mi aplicación real, siempre estoy recibiendo un error que indica "El archivo adjunto no es válido". El control AsyncFileUpload lo devuelve cuando el archivo cargado es nulo.

para aislar el problema, he creado una nueva página maestra exactamente igual que la página maestra en mi aplicación de demostración. También creé una página aspx exactamente como la página en mi aplicación de demostración. La carga aún falla con un error "El archivo adjunto no es válido".

También comparó el web.config de la aplicación real y la aplicación de demostración y no podía identificar cualquier diferencia que debe importar.

El código siguiente es el código de prueba en mi verdadera aplicación. Este código es exactamente el mismo que el código de funcionamiento en la aplicación de demostración, con la excepción de tener diferentes nombres de clase y nombres de archivo. El archivo web.config que se muestra a continuación es de la aplicación real con las aplicaciones y las conexiones eliminadas.

En este punto, estoy completamente perplejo.

real Test App de páginas principales:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="aaaMasterPage.master.cs" Inherits="L1Admin.aaaMasterPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Untitled Page</title> 
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>  
    <asp:ContentPlaceHolder id="head" runat="server"> 
    </asp:ContentPlaceHolder> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager ID="scriptManager" EnablePartialRendering="true" runat="server" AsyncPostBackTimeout="180" />  
    <div> 
     <asp:ContentPlaceHolder id="content" runat="server"> 

     </asp:ContentPlaceHolder> 
    </div> 
    </form> 
</body> 
</html> 

página de prueba:

<%@ Page Language="C#" MasterPageFile="~/aaaMasterPage.master" AutoEventWireup="true" CodeFile="aaaFileUploadTest2.aspx.cs" Inherits="aaaFileUploadTest2" Title="Untitled Page" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %> 

    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
     <script type="text/javascript"> 
      function pageLoad(sender, args) { 
      } 

      function startUpload(sender,args) 
      { 
       $('#uploadMessage p').html(); 
       $('#uploadMessage').hide(); 
      } 

      function uploadComplete(sender,args) 
      { 
       showUploadMessage(args.get_fileName() + " uploaded succesfully - " + + args.get_length() + " bytes", ''); 
      } 

      function uploadError(sender, args) 
      { 
       showUploadMessage("An error occurred during uploading. " + args.get_errorMessage(), '#ff0000'); 
      } 

      function showUploadMessage(text, color) 
      { 
       $('#uploadMessage p').html(text).css('color', color); 
       $('#uploadMessage').show(); 
      } 
     </script> 
    </asp:Content> 
    <asp:Content ID="Content2" ContentPlaceHolderID="content" Runat="Server">  
     <div id="uploadMessage"><p></p></div> 
     <ajax:AsyncFileUpload ID="pageBannerUpload" 
      CssClass="file_upload" 
      OnClientUploadError="uploadError" 
      OnClientUploadStarted="startUpload" 
      OnClientUploadComplete="uploadComplete" 
      onuploadedcomplete="upload_UploadedComplete" 
      runat="server" /> 
    </asp:Content> 

prueba de una aplicación real código de página Atrás:

using System; 
using System.IO; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Xml.Linq; 

public partial class aaaFileUploadTest2 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    protected void upload_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e) 
    { 
     if (pageBannerUpload.HasFile) 
     { 
      string path = MapPath("~/") + Path.GetFileName(e.filename); 
      pageBannerUpload.SaveAs(path); 
     } 
    } 
} 

real Test App Web.config:

<?xml version="1.0"?> 
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use 
    the Website->Asp.Net Configuration option in Visual Studio. 
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
--> 
<configuration> 
    <configSections> 
     <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
      <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
       <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
       <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
        <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> 
        <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
        <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
        <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> 
       </sectionGroup> 
      </sectionGroup> 
     </sectionGroup> 
    </configSections> 
    <appSettings> 

    </appSettings> 
    <connectionStrings> 
    </connectionStrings> 
    <system.web> 
     <!-- 
      Set compilation debug="true" to insert debugging 
      symbols into the compiled page. Because this 
      affects performance, set this value to true only 
      during development. 
     --> 
     <compilation debug="true"> 
      <assemblies> 
       <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
       <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
       <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
       <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
       <add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
       <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> 
      </assemblies> 
      <codeSubDirectories> 
       <add directoryName="CSCode"/> 
       <add directoryName="VBCode"/> 
      </codeSubDirectories> 
     </compilation> 
     <!-- 
      The <authentication> section enables configuration 
      of the security authentication mode used by 
      ASP.NET to identify an incoming user. 
     --> 
     <authentication mode="Windows"/> 
     <!-- 
      The <customErrors> section enables configuration 
      of what to do if/when an unhandled error occurs 
      during the execution of a request. Specifically, 
      it enables developers to configure html error pages 
      to be displayed in place of a error stack trace. 

     <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> 
      <error statusCode="403" redirect="NoAccess.htm" /> 
      <error statusCode="404" redirect="FileNotFound.htm" /> 
     </customErrors> 
     --> 
     <pages> 
      <controls> 
       <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
       <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
       <add tagPrefix="Annsa" namespace="Annsa.Controls" assembly="Annsa.Controls"/> 
      </controls> 
      <namespaces> 
       <add namespace="Microsoft.VisualBasic"/> 
       <add namespace="System.Data"/> 
       <add namespace="System.Drawing"/> 
      </namespaces> 
     </pages> 
     <httpHandlers> 
      <remove verb="*" path="*.asmx"/> 
      <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
      <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
      <add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </httpHandlers> 
     <httpModules> 
      <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </httpModules> 
     <identity impersonate="true"/> 
     <trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true"/> 
     <!-- SESSION STATE SETTINGS 
      mode="Off|InProc|StateServer|SqlServer" 
      By default ASP.NET uses cookies to identify which requests belong to a particular session. 
      If cookies are not available, a session can be tracked by adding a session identifier to the URL. 
      To disable cookies, set sessionState cookieless="true". 
     --> 
     <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20"/> 
     <!-- GLOBALIZATION 
      This section sets the globalization settings of the application. 
     --> 
     <xhtmlConformance mode="Legacy"/> 
    </system.web> 
    <location path="Pages"> 
    <system.web> 
     <xhtmlConformance mode="Transitional"></xhtmlConformance> 
    </system.web> 
    </location> 
    <system.codedom> 
     <compilers> 
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
       <providerOption name="CompilerVersion" value="v3.5"/> 
       <providerOption name="WarnAsError" value="false"/> 
      </compiler> 
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> 
       <providerOption name="CompilerVersion" value="v3.5"/> 
       <providerOption name="OptionInfer" value="true"/> 
       <providerOption name="WarnAsError" value="false"/> 
      </compiler> 
     </compilers> 
    </system.codedom> 
    <system.webServer> 
     <validation validateIntegratedModeConfiguration="false"/> 
     <modules> 
      <remove name="ScriptModule"/> 
      <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </modules> 
     <handlers> 
      <remove name="WebServiceHandlerFactory-Integrated"/> 
      <remove name="ScriptHandlerFactory"/> 
      <remove name="ScriptHandlerFactoryAppServices"/> 
      <remove name="ScriptResource"/> 
      <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
      <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
      <add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     </handlers> 
    </system.webServer> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> 
       <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
      <dependentAssembly> 
       <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> 
       <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Editar: Ya no trabajo para esta empresa, por lo que no puedo probar nuevas respuestas para ver si solucionan el problema.

+0

Ran la muestra con un web.config defecto, jQuery 1.4.1 y 3.5 AjaxControlToolkit .50731; Cambié la página maestra a un ToolkitScriptManager y funcionó bien. Apagué el error después de cambiar a su web.config (también creado App_Code \ CS | VBCode carpetas). – user423430

+0

en la función startUpload (sender, args) { $ ('# uploadMessage p'). Html(); $ ('# uploadMessage'). Hide(); } $ ('# uploadMessage p'). Html(); no hace nada Devolvería el html a una variable o algo así, pero cuando se utiliza de esta manera no está haciendo nada, creo. ¿Desea eliminar el html existente? $ ('# uploadMessage p'). html ('') o $ ('# uploadMessage p'). empty(); Dudo que este sea el problema, pero no obstante, jQuery no se usa correctamente. – Hcabnettek

+0

esto es, la solución real: http://forums.asp.net/p/1547959/3788044.aspx –

Respuesta

20

que estaba teniendo el mismo problema en .NET 4. Tengo que trabajar con estableciendo el ClientIDMode = "AutoID" en el control.

+0

El problema en este ejemplo específico de .NET 3.5 es cambiando los delimitadores de nombre de control de '_' a ':'. El control AsyncFileUpload hace un trabajo bastante ingenioso de verificar para asegurarse de que se supone que procesa la carga del archivo. http://ajaxcontroltoolkit.codeplex.com/workitem/26975 – user423430

+0

1 Esto resolvió mi problema también. –

0

¿Es posible que estés exceder el límite de subida? ¿Cuál es el tamaño del archivo que estás cargando?

Puede ajustar el tamaño en su web.config:

<system.web> 
    <httpRuntime executionTimeout="110" maxRequestLength="20000" /> 
</system.web> 
+0

22kb. El mismo archivo que funciona bien en la aplicación de demostración. Editar: No está especificado en la aplicación de demostración tampoco, así que supongo que ambos están utilizando el predeterminado. –

+1

a veces el entorno de demostración es diferente al entorno de producción. ¿Ha comprobado los permisos en el directorio donde se guarda el archivo? – Pbirkoff

+0

Ambas aplicaciones se ejecutaban en mi máquina de desarrollo. –

1

la solución de user423430 es la correcta si ha migrado su proyecto web: Cuando migra automáticamente un Proyecto Web VS 2003 a VS 2005, el Web.config se modifica automáticamente. <xhtmlConformance mode="Legacy" /> se agrega en él. Se recommanded a lo utilice con ajax:

http://weblogs.asp.net/scottgu/archive/2006/12/10/gotcha-don-t-use-xhtmlconformance-mode-legacy-with-asp-net-ajax.aspx

(ASP.NET 1.0 y 1.1 no emiten marcado XHTML compatible de muchos de sus controles de servidor ASP.NET 2.0 cambió esto y de forma predeterminada. emite marcado compatible con XHTML de todos los controles.)

0

Cuando se utiliza "AsyncFileUpload" dentro de un Gridiview, utilice ClientIDMode = "AutoID"

Cuestiones relacionadas