我正在使用ajaxFileUpload,如此处所述:http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/AjaxFileUpload/AjaxFileUpload.aspx
除在同一页面上有多个文件上传控件外,它工作正常。具体来说,我正在尝试针对不同的问题上传不同的文件。当我在页面上上传第一个文件时,它可以正常工作,但是页面下方的那个文件只会将其文件上传到第一个问题的答案中。
我不确定这是否有意义...因此它可以帮助您了解使用ascx文件动态填充问题的页面。文档ascx文件如下所示:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Document.ascx.cs" Inherits="ScholarshipApplication.controls.questions.Document" %>
<ajaxToolkit:AjaxFileUpload OnUploadComplete="UploadComplete" ID="FileUploadControl" MaximumNumberOfFiles="1" runat="server" AllowedFileTypes="png,jpg,jpeg,pdf,tiff,tif,gif" />
<asp:LinkButton ID="downloadButton" runat="server" CausesValidation="false" OnClick="downloadButton_Click" />
以及后面的代码:
public void UploadComplete(object sender, AjaxFileUploadEventArgs e)
{
entry.data = e.FileName;
entry.setDocumentData(e.GetContents());
this.downloadButton.Text = e.FileName;
}
我最初的想法是,我需要以某种方式帮助控件生成的javascript知道应该在何时触发哪个问题。
最佳答案
我认为这是控制上的错误,或者是出于某些非显而易见的原因而实现的。实际上,此控件不支持页面上的多个实例。考虑使用AsyncFileUpload control代替或自定义AjaxFileUpload
控件的位源。如果您喜欢第二种选择,则需要从此处下载源:http://ajaxcontroltoolkit.codeplex.com/SourceControl/BrowseLatest并更改AjaxFileUpload.cs文件(此处为路径:/Server/AjaxControlToolkit/AjaxFileUpload/AjaxFileUpload.cs
)。您需要做的是将ContextKey
常量更改为属性,以将上下文键guid与唯一的控件ID组合在一起:
public class AjaxFileUpload : ScriptControlBase
{
private const string ContextKeySuffix = "{DA8BEDC8-B952-4d5d-8CC2-59FE922E2923}";
private string ContextKey
{
get { return this.UniqueID + "_" + ContextKeySuffix; }
}
实际上,如果您查看
PreRender
类的AjaxFileUpload
方法,您将很容易意识到这种控件的这种行为(第一个控件句柄从页面上的所有同级控件上载)。