Asp.Net Ajax 工具包 AsyncFileUpload - 出现“所附文件无效”错误

12

我正在尝试使用Asp.net Ajax Control Toolkit(2009年9月30日稳定版本:30930)中的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>

编辑:我不再在这个公司工作,所以无法测试任何新的答案来查看它们是否解决了问题。


这就是它,真正的解决方案:http://forums.asp.net/p/1547959/3788044.aspx - user380814
使用默认的web.config、jquery 1.4.1和AjaxControlToolkit 3.5.50731运行示例;将主页面切换到ToolkitScriptManager,它可以正常工作。 在切换到您的web.config(还创建了App_Code\CS|VBCode文件夹)后,我遇到了错误。 - user423430
在函数startUpload(sender,args)中{ $('#uploadMessage p').html(); $('#uploadMessage').hide(); } $('#uploadMessage p').html(); 并没有做任何事情。当以这种方式使用时,它会将HTML返回给变量或其他东西,但是我认为它不起作用。您想删除现有的HTML吗?$('#uploadMessage p').html('') 或者 $('#uploadMessage p').empty(); 我怀疑这不是问题所在,但无论如何,jQuery 的使用方法不正确。 - Hcabnettek
4个回答

20

我在.NET 4中遇到了同样的问题。通过在控件上设置ClientIDMode="AutoID",我解决了这个问题。


这个特定的.NET 3.5示例中的问题是<xhtmlConformance mode="Legacy" />将控件名称分隔符从“_”更改为“:”。AsyncFileUpload控件在检查是否应该处理文件上传方面做得相当愚蠢。http://ajaxcontroltoolkit.codeplex.com/workitem/26975 - user423430

1

如果您已经迁移了Web项目,则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

当您在GridView中使用"AsyncFileUpload"时,请使用ClientIDMode="AutoID"


0

你是否超过了上传限制?你正在上传的文件大小是多少?

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

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

22kb。在演示应用程序中正常工作的相同文件。编辑:演示应用程序中也没有指定,因此我会假设它们都使用默认设置。 - Craig M
1
有时演示环境与生产环境不同。您是否检查了文件保存目录的权限? - Pbirkoff
这两个应用程序都在我的开发机上运行。 - Craig M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接