2010-02-22 48 views
11

我想从Asp.net Ajax控件工具包(2009年9月30日稳定版本:30930)使用AsyncFileUpload控件。我创建了一个演示应用程序,并且控件正常工作。文件上传,一切都很好。Asp.Net Ajax工具包AsyncFileUpload - “文件附加无效”错误

当我尝试在我的真实应用程序中使用该控件时,我总是收到一个错误,指出“附加的文件无效”。当上传的文件为空时,AsyncFileUpload控件返回这个。

要隔离问题,我创建了一个新的母版页,与我的演示应用程序中的母版页完全一样。我还创建了一个与我的演示应用程序中的页面完全相同的aspx页面。上传仍然失败,并显示“附件无效”错误。

我还比较了真实应用程序和演示应用程序的web.config,并且无法识别任何应该处理的差异。

下面的代码是我的真实应用程序中的测试代码。此代码与演示应用程序中正在运行的代码完全相同,但具有不同的类名和文件名。下面列出的web.config来自实际应用程序,其中删除了appsettings和connectionstrings。

在这一点上,我完全难倒了。

真正的应用程序测试母版页:

<%@ 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> 

测试页:

<%@ 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> 

真正的应用程序测试页代码背后:

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); 
     } 
    } 
} 

真正的应用程序测试的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> 

编辑:我不再为这家公司工作,所以我不能测试任何新的答案,看看他们是否解决了这个问题。

+0

然具有默认的web.config,jquery的1.4.1样品,并且AjaxControlToolkit 3.5 。50731;将母版页切换到ToolkitScriptManager并且工作正常。 切换到您的web.config(也创建App_Code \ CS | VBCode文件夹)后,我遇到了错误。 – user423430 2011-09-06 19:48:04

+0

函数startUpload(sender,args){('#uploadMessage p')。html(); $('#uploadMessage')。hide(); } $('#uploadMessage p')。html();没有做任何事情。它会将html返回给一个变量或某个东西,但是当以这种方式使用它时,它不会做任何我相信的事情。你想删除现有的HTML吗? $('#uploadMessage p')。html('')或$('#uploadMessage p')。empty();我怀疑这是问题所在,但是jQuery没有正确使用。 – Hcabnettek 2011-09-14 20:05:51

+0

这就是它,真正的解决方案:http://forums.asp.net/p/1547959/3788044.aspx – 2010-07-01 06:55:22

回答

20

我是有在.NET 4同样的问题我得到了它由控制设置的ClientIDMode =“自动识别”有工作。

+0

此特定.NET 3.5示例中的问题是将控件名称分隔符从'_'更改为':'。 AsyncFileUpload控件做了一个非常头疼的工作,检查它是否应该处理文件上传。 http://ajaxcontroltoolkit.codeplex.com/workitem/26975 – user423430 2011-09-06 20:57:27

+0

1这也解决了我的问题。 – 2017-01-21 05:04:36

0

是否有可能超出上传限制?你上传的文件大小是多少?

你可以在你的web.config中设置的大小:

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

22kb。在演示应用程序中可以正常工作的相同文件。 编辑:它没有在演示应用程序中指定,所以我假设他们都使用默认值。 – 2010-02-22 21:55:31

+1

有时演示环境与生产环境不同。你是否检查过保存文件的目录? – Pbirkoff 2010-02-23 11:11:21

+0

这两个应用程序都在我的开发机器上运行。 – 2010-11-14 20:05:47

1

如果您已经迁移了您的webproject,则user423430的解决方案是正确的:当您自动将VS 2003 Web项目迁移到VS 2005时,Web.config将自动进行修改。其中添加了<xhtmlConformance mode="Legacy" />。 它建议报告到不与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和1.1不发射从它的许多服务器控件的XHTML兼容的标记ASP.NET 2.0改变了这种并默认。从所有的控制发射XHTML兼容的标记。)

0

当使用Gridiview内 “AsyncFileUpload”,使用的ClientIDMode = “自动识别”

相关问题