【问题标题】:ajaxfileupload multiple inputs on pageajaxfile在页面上上传多个输入
【发布时间】:2013-01-03 02:09:51
【问题描述】:

我正在使用 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 知道它应该何时触发哪个问题。

【问题讨论】:

    标签: c# ajaxcontroltoolkit


    【解决方案1】:

    我认为这是控制中的错误,或者这是由一些不明显的原因实现的。实际上,此控件不支持页面上的多个实例。考虑改用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; }
        }
    

    实际上,如果您查看AjaxFileUpload 类的PreRender 方法,您将很容易意识到此控件的这种行为的原因(第一个控件句柄从页面上的所有同级控件上传)。

    【讨论】:

    • 哇!你的回答是经过深思熟虑的。我继续并切换到 AsyncFileUpload 并发现它工作得很好。我会在以后尝试源代码,但这目前有效。谢谢!
    • Yuriy Rozhovetskiy 感谢您的回答...我不知道如何实现上述代码..您能建议我吗
    • 我已经按照你说的修改了源代码,但是我该如何使用那个源代码以及在哪里构建......stackoverflow.com/questions/22296308/…
    【解决方案2】:

    根据我的理解,您需要一个隐藏字段变量来识别您在 UserControl 中的问题 ID:

    <input type="hidden" id="hdnQuestionId" runat="server"/>
    

    在填充/生成问题时,您需要设置此变量,当您上传文档时,获取此隐藏值并使用它。

    【讨论】:

    • 我不确定我是否理解您的解决方案。我如何使用这个隐藏的价值?你能提供一个小代码示例吗?
    • @mcfea 我也有同样的问题..你能说如何编辑ajax的源代码并使用它
    • @VigneshKumar,我已经很久没有看过这段代码了。根据上面 Yuriy Rozhovetskiy 的评论,我切换到了 AsyncFileUpload 控件。由于 Async 可以满足我们的需求,因此我实际上从未有时间修改源代码。
    【解决方案3】:

    我在所有 AjaxFileUpload 控件上创建了一个名为“data-upload-type”的数据属性,并将其设置为类型的名称。然后我设置客户端调用以获取该值并设置具有相同值的 cookie。 cookie 在服务器端函数上接收,我根据接收到的值进行分支。

    这是一个例子:

    function StartUpload(sender, args) {
        var t = $(sender._element).attr('data-upload-type');
        document.cookie = 'upload-type=' + $(sender._element).attr('data-upload-type') + ';';
    }
    
    <asp:AjaxFileUpload ID="afuUploader1" runat="server"  OnClientUploadStart="StartUpload" OnUploadComplete="UploadComplete" OnClientUploadComplete="UploadComplete" data-upload-type="UploadType2"></asp:AjaxFileUpload>
    

    然后在您的服务器端上传调用中只需检查 Response.Cookies("upload-type")。 像魅力一样工作!

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2019-03-23
      相关资源
      最近更新 更多