2013-01-03 103 views
3

我使用ajaxFileUpload這裏描述的:http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/AjaxFileUpload/AjaxFileUpload.aspxajaxfileupload多個輸入

它工作正常,除非我有相同的頁面上的多個文件上傳控件。具體來說,我試圖上傳不同的文件來解決不同的問題。當我上傳頁面上的第一個頁面時,它可以正常工作,但頁面中較低的頁面只會將其文件上傳到第一個問題的答案中。

我不確定這是否合理......所以它可以幫助您知道我的頁面使用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知道哪些問題應該觸發時。

回答

2

我相信這是一個控制中的錯誤,或者這是由一些不明顯的原因實現的。實際上,此控件不支持頁面上的多個實例。請考慮使用AsyncFileUpload control代替或自定義AjaxFileUpload控件的位源。如果你更喜歡第二選項,那麼你需要從這裏下載源代碼:http://ajaxcontroltoolkit.codeplex.com/SourceControl/BrowseLatest並更改AjaxFileUpload.cs文件(這裏是一個路徑:/Server/AjaxControlToolkit/AjaxFileUpload/AjaxFileUpload.cs)。你需要做的是改變ContextKey常數屬性相結合的控制的唯一ID的GUID背景下鍵:

public class AjaxFileUpload : ScriptControlBase 
{ 
    private const string ContextKeySuffix = "{DA8BEDC8-B952-4d5d-8CC2-59FE922E2923}"; 

    private string ContextKey 
    { 
     get { return this.UniqueID + "_" + ContextKeySuffix; } 
    } 

其實,如果你看看上AjaxFileUpload類的PreRender方法,你會很容易實現振振有辭的此控件的這種行爲(第一個控件句柄從頁面上的所有兄弟控件上載)。

+0

哇!你的答案經過深思熟慮。我繼續前進並切換到AsyncFileUpload,發現它工作得很好。我會給源代碼一個嘗試的道路,但現在這個工作。謝謝! – mcfea

+0

Yuriy Rozhovetskiy感謝您的回答...我不知道如何實現上面的代碼..你可以建議我 –

+0

我已經改變了源代碼,正如你所說的,但我怎麼能使用該源代碼和在哪裏建立。 ... HTTP://stackoverflow.com/questions/22296308/modifying-ajaxtoolkit-source-code –

0

按我的理解,你需要一個隱藏字段變量,以確定您的問題ID在用戶控件:

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

在填充/生成問題,你需要設置這個變量,當你上傳的文檔,獲取該隱藏價值並使用它。

+0

我不確定我瞭解您的解決方案。我如何使用這個隱藏的值?你能否提供一個小代碼示例? – mcfea

+0

@mcfea我也有同樣的問題..你可以說如何編輯ajax的源代碼並使用它 –

+0

@VigneshKumar,自從我看了這段代碼已經很長時間了。我根據上面的Yuriy Rozhovetskiy的評論切換到了AsyncFileUpload控件。我從來沒有真正想過修改源代碼,因爲Async符合我們的需求。 – mcfea

0

我在所有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(「上載型」)。 工程就像一個魅力!