2011-02-16 68 views
4

我在網頁上實現了AsyncFileUpload控件。該網頁要求上傳的文件出現在GridView
GridView包含以下欄目:「文件名」,「機密」複選框,以及「刪除」按鈕來刪除上傳的文件。AsyncFileUpload回發導致重複上傳

由於AsyncFileUpload回傳沒有做一個網頁提交,我需要「力」的OnClientUploadComplete事件AsyncFileUpload控制的回傳,以便上傳文件後呈現GridView的。
OnClientUploadCompleteEvent中,我使用javascript調用__doPostBack。在這個回發中,我只綁定我的GridView並顯示文件信息(我不重新保存文件)。

問題:AsyncFileUpload第一個」局部「回傳,文件被上傳成功,符合市場預期。在第二次回覆中,我強制要求__doPostBack,文件重新上傳。
您可以使用顯示上傳進度的Google Chrome進行驗證。行爲如下:
- 選擇文件後,進度從0%增加到100%,並上傳文件。
- 之後,執行__doPostBack,您可以再次看到上傳進度增量從0%到100%。

如何確保Gridview正確填充,但該文件沒有上傳兩次?

我重視它包含了問題的樣品溶液:https://www.yousendit.com/download/MzZFc2ZBNDRrYUN4dnc9PQ

+0

請幫我@ user619814:http://stackoverflow.com/questions/18682909/display-gridview-after-upload-file-in-asyncfileupload-in-updatepanel-asp- net-cs – 2013-09-08 12:05:35

回答

2

也許醜陋,但工作原理:


1) 添加CSS隱藏的asp:按鈕波紋管在ASP:AsyncFileUpload AsyncFileUpload1控制。

<asp:Button runat="server" ID="btnClick" Text="Update grid" style="display:none"/> 

2) 在Page_Load方法,取出if (Request.Params.Get("__EVENTTARGET") == "UploadPostback"),並把它的塊以簡單else到先前if

3) 在AsyncFileUpload1_UploadedComplete函數上,也刪除if (Request.Params.Get("__EVENTTARGET") != "UploadPostback")行,但保留其中的所有內容。

4) 回到aspx。在網格GridView1之外放置一個asp:UpdatePanel。

<asp:UpdatePanel runat="server" UpdateMode="Conditional"> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="btnClick" EventName="Click" /> 
    </Triggers> 
    <ContentTemplate> 

    <asp:GridView ID="GridView1" ... 
    YOUR GRID CODE REMAINS THE SAME 
    </asp:GridView> 

    </ContentTemplate> 
</asp:UpdatePanel> 

5) 最後一步是改變AjaxUploadComplete客戶端的JavaScript功能以使其觸發回發。 用下列替換:

function AjaxUploadComplete() { 
    var btnClick = document.getElementById("btnClick"); 
    btnClick.click(); 
} 

用戶選擇上載的僅一次的任何文件。
此處的所有更改都是在您的AjaxUpload.zip的AjaxUpload.aspx & AjaxUpload.aspx.cs中進行的。

+0

這不會是我想要完成這種行爲的代碼,但是我做了更少的可能更改,以便實現您的目標。 – tiago2014 2011-02-16 21:29:43

+0

感謝tiagoinu,您的解決方案可以完成這項工作。你搖滾! – user619814 2011-02-18 12:30:13

0

我無法訪問包含該問題的示例解決方案,但在我的項目中使用AsyncFileUpload組件也遇到了雙重回發。 我發現了一個很簡單的解決方法:

只需添加:

private bool justUploaded = false; 

然後:

void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e) 
{ 
    if (justUploaded) return; 
    justUploaded = true; 
    // rest of your upload code 
} 
3

有一個簡單的解決方案

@@ t0x1n3Himselfü給的解決方案是非常簡單但不起作用

環繞AsyncFileUpload與更新面板命名爲UpdatePanelAFU 然後在UpdatePanelAFU做如下所示:

protected void AsyncFileUpload_UpdatePanelAFU(object sender,AjaxControlToolkit.AsyncFileUploadEventArgs e) 
{ 

    if (Request.Params.Get("__EVENTTARGET") != "UpdatePanelAFU") 
     return; 
..... rest of the code 
} 

享受!

0

我覺得這是一個更好的解決方案,在這裏找到:http://forums.asp.net/t/1951566.aspx?AsyncFileUpload+uploads+twice),但下面是我的改變完全工作代碼:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>AsyncFileUpload Example</title> 
    <script type = "text/javascript"> 
     function uploadComplete(sender) { 
      $get("<%=lblMesg.ClientID%>").innerHTML = "File Uploaded Successfully"; 
      clearContents(); 
     } 


     function uploadError(sender) { 
      $get("<%=lblMesg.ClientID%>").innerHTML = "File upload failed."; 
      clearContents(); 
     } 


    function clearContents() { 
      var span = $get("<%=AsyncFileUpload1.ClientID%>"); 
      var txts = span.getElementsByTagName("input"); 
      for (var i = 0; i < txts.length; i++) { 
       if (txts[i].type == "text") { 
        txts[i].value = ""; 
       } 
       if (txts[i].type == "file") { 
        txts[i].value = ""; 
       } 
      } 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:ScriptManager ID="ScriptManager1" runat="server"> 
     </asp:ScriptManager> 
     <cc1:AsyncFileUpload OnClientUploadError="uploadError" 
      OnClientUploadComplete="uploadComplete" runat="server" 
      ID="AsyncFileUpload1" Width="400px" UploaderStyle="Modern" EnableViewState = "false" 
      UploadingBackColor="#CCFFFF" ThrobberID="imgLoader" OnUploadedComplete = "FileUploadComplete" 
      /> 
     <asp:Image ID="imgLoader" runat="server" ImageUrl = "~/images/loader.gif" /> 
     <br /> 
     <asp:Label ID="lblMesg" runat="server" Text=""></asp:Label> 






    </form> 
</body> 
</html> 
1

AsyncFileUpload有一個名爲IsUploading財產。 當此屬性設置爲false時,將發生postback。 您可以檢查此屬性是這樣的:

if(AsyncFileUpload1.IsUploading) 
{ 
    ..... upload codes 
} 
1

我相信@Veera說得對。 UploadComplete在文件上傳時被多次調用。以下爲我工作。

void AsyncFileUpload1_UploadedComplete(object sender, AsyncFileUploadEventArgs e) { 
 
    if (AsyncFileUpload1.IsUploading) return; 
 
    // rest of your upload code 
 
}