簡體   English   中英

AsyncFileUpload回發導致雙重上傳

[英]AsyncFileUpload postback causes double upload

我在網頁上實現了AsyncFileUpload控件。 此網頁要求上載的文件顯示在GridView
GridView包含以下列:“ 文件名 ”,“ 機密 ”復選框和“ 刪除 ”按鈕,以刪除上載的文件。

由於AsyncFileUpload回發不執行整頁回發,因此我需要在AsyncFileUpload控件的OnClientUploadComplete事件上“強制”回發,以便在上傳文件后呈現gridview。
OnClientUploadCompleteEvent ,我使用javascript調用__doPostBack 在此回發中,我僅綁定GridView並顯示文件信息(我不重新保存文件)。

問題: AsyncFileUpload的第一次“部分”回發中,文件已按預期成功上傳。 在我使用__doPostBack強制執行的第二次回發中,該文件被重新上傳。
您可以使用顯示上傳進度的Google Chrome進行驗證。 行為如下:
-選擇文件后,進度從0%遞增到100%,並上傳文件。
-此后,將執行__doPostBack ,然后您可以再次看到上傳進度從0%遞增到100%。

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

我附帶了一個包含問題的示例解決方案: https : //www.yousendit.com/download/MzZFc2ZBNDRrYUN4dnc9PQ

有一個更簡單的解決方案

@@ t0x1n3Himself您提供的解決方案非常簡單,但不起作用

在AsyncFileUpload周圍放置一個名為UpdatePanelAFU的更新面板,然后在UpdatePanelAFU中執行以下操作:

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

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

請享用!

也許很難看,但是可以工作:


1)在asp:AsyncFileUpload AsyncFileUpload1控件下面添加一個css隱藏的asp:Button。

<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中進行。

我相信@Veera正確。 文件上傳時,多次調用UploadComplete。 以下對我有用。

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

我無權訪問包含該問題的示例解決方案,但在我的帶有AsyncFileUpload組件的項目中,我也遇到了兩次回發。 我發現了一個非常簡單的解決方法:

只需添加:

private bool justUploaded = false;

然后:

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

我發現這是一個更優雅的解決方案,可以在這里找到: 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>

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM